diff --git a/phosphor-regulators/test/chassis_tests.cpp b/phosphor-regulators/test/chassis_tests.cpp
new file mode 100644
index 0000000..707fff5
--- /dev/null
+++ b/phosphor-regulators/test/chassis_tests.cpp
@@ -0,0 +1,104 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "chassis.hpp"
+#include "device.hpp"
+#include "i2c_interface.hpp"
+#include "test_utils.hpp"
+
+#include <memory>
+#include <stdexcept>
+#include <utility>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+using namespace phosphor::power::regulators::test_utils;
+
+TEST(ChassisTests, Constructor)
+{
+    // Test where works: Only required parameters are specified
+    {
+        Chassis chassis{2};
+        EXPECT_EQ(chassis.getNumber(), 2);
+        EXPECT_EQ(chassis.getDevices().size(), 0);
+    }
+
+    // Test where works: All parameters are specified
+    {
+        // Create vector of Device objects
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.push_back(std::make_unique<Device>(
+            "vdd_reg1", true, "/system/chassis/motherboard/reg1",
+            std::move(createI2CInterface())));
+        devices.push_back(std::make_unique<Device>(
+            "vdd_reg2", true, "/system/chassis/motherboard/reg2",
+            std::move(createI2CInterface())));
+
+        // Create Chassis
+        Chassis chassis{1, std::move(devices)};
+        EXPECT_EQ(chassis.getNumber(), 1);
+        EXPECT_EQ(chassis.getDevices().size(), 2);
+    }
+
+    // Test where fails: Invalid chassis number < 1
+    try
+    {
+        Chassis chassis{0};
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Invalid chassis number: 0");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+TEST(ChassisTests, GetDevices)
+{
+    // Test where no devices were specified in constructor
+    {
+        Chassis chassis{2};
+        EXPECT_EQ(chassis.getDevices().size(), 0);
+    }
+
+    // Test where devices were specified in constructor
+    {
+        // Create vector of Device objects
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.push_back(std::make_unique<Device>(
+            "vdd_reg1", true, "/system/chassis/motherboard/reg1",
+            std::move(createI2CInterface())));
+        devices.push_back(std::make_unique<Device>(
+            "vdd_reg2", true, "/system/chassis/motherboard/reg2",
+            std::move(createI2CInterface())));
+
+        // Create Chassis
+        Chassis chassis{1, std::move(devices)};
+        EXPECT_EQ(chassis.getDevices().size(), 2);
+        EXPECT_EQ(chassis.getDevices()[0]->getID(), "vdd_reg1");
+        EXPECT_EQ(chassis.getDevices()[1]->getID(), "vdd_reg2");
+    }
+}
+
+TEST(ChassisTests, GetNumber)
+{
+    Chassis chassis{3};
+    EXPECT_EQ(chassis.getNumber(), 3);
+}
diff --git a/phosphor-regulators/test/device_tests.cpp b/phosphor-regulators/test/device_tests.cpp
index 955e6d8..2ae4d6f 100644
--- a/phosphor-regulators/test/device_tests.cpp
+++ b/phosphor-regulators/test/device_tests.cpp
@@ -20,6 +20,7 @@
 #include "mock_action.hpp"
 #include "presence_detection.hpp"
 #include "rail.hpp"
+#include "test_utils.hpp"
 
 #include <memory>
 #include <optional>
@@ -29,18 +30,7 @@
 #include <gtest/gtest.h>
 
 using namespace phosphor::power::regulators;
-
-/**
- * Create an I2CInterface object with hard-coded bus and address values.
- *
- * @return I2CInterface object wrapped in a unique_ptr
- */
-std::unique_ptr<i2c::I2CInterface> createI2CInterface()
-{
-    std::unique_ptr<i2c::I2CInterface> i2cInterface =
-        i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
-    return i2cInterface;
-}
+using namespace phosphor::power::regulators::test_utils;
 
 TEST(DeviceTests, Constructor)
 {
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index 5042cd3..0c2ba50 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -4,6 +4,7 @@
 )
 
 phosphor_regulators_tests_source_files = [
+    'chassis_tests.cpp',
     'configuration_tests.cpp',
     'device_tests.cpp',
     'id_map_tests.cpp',
diff --git a/phosphor-regulators/test/test_utils.hpp b/phosphor-regulators/test/test_utils.hpp
new file mode 100644
index 0000000..cbb322a
--- /dev/null
+++ b/phosphor-regulators/test/test_utils.hpp
@@ -0,0 +1,33 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "i2c_interface.hpp"
+
+#include <memory>
+
+namespace phosphor::power::regulators::test_utils
+{
+
+/**
+ * Create an I2CInterface object with hard-coded bus and address values.
+ *
+ * @return I2CInterface object wrapped in a unique_ptr
+ */
+inline std::unique_ptr<i2c::I2CInterface> createI2CInterface()
+{
+    return i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
+}
+
+} // namespace phosphor::power::regulators::test_utils
