diff --git a/phosphor-regulators/test/actions/pmbus_read_sensor_action_tests.cpp b/phosphor-regulators/test/actions/pmbus_read_sensor_action_tests.cpp
new file mode 100644
index 0000000..4af095c
--- /dev/null
+++ b/phosphor-regulators/test/actions/pmbus_read_sensor_action_tests.cpp
@@ -0,0 +1,161 @@
+/**
+ * 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 "action_environment.hpp"
+#include "i2c_action.hpp"
+#include "i2c_interface.hpp"
+#include "pmbus_read_sensor_action.hpp"
+#include "pmbus_utils.hpp"
+
+#include <cstdint>
+#include <optional>
+#include <stdexcept>
+#include <string>
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+TEST(PMBusReadSensorActionTests, Constructor)
+{
+    // Test where works: exponent value is specified
+    try
+    {
+        pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::iout};
+        uint8_t command = 0x8C;
+        pmbus_utils::SensorDataFormat format{
+            pmbus_utils::SensorDataFormat::linear_16};
+        std::optional<int8_t> exponent{-8};
+        PMBusReadSensorAction action{type, command, format, exponent};
+        EXPECT_EQ(action.getType(), pmbus_utils::SensorValueType::iout);
+        EXPECT_EQ(action.getCommand(), 0x8C);
+        EXPECT_EQ(action.getFormat(), pmbus_utils::SensorDataFormat::linear_16);
+        EXPECT_EQ(action.getExponent().has_value(), true);
+        EXPECT_EQ(action.getExponent().value(), -8);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where works: exponent value is not specified
+    try
+    {
+        pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::iout};
+        uint8_t command = 0x8C;
+        pmbus_utils::SensorDataFormat format{
+            pmbus_utils::SensorDataFormat::linear_11};
+        std::optional<int8_t> exponent{};
+        PMBusReadSensorAction action{type, command, format, exponent};
+        EXPECT_EQ(action.getType(), pmbus_utils::SensorValueType::iout);
+        EXPECT_EQ(action.getCommand(), 0x8C);
+        EXPECT_EQ(action.getFormat(), pmbus_utils::SensorDataFormat::linear_11);
+        EXPECT_EQ(action.getExponent().has_value(), false);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+TEST(PMBusReadSensorActionTests, Execute)
+{
+    // TODO: Not implemented yet
+}
+
+TEST(PMBusReadSensorActionTests, GetCommand)
+{
+    pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::iout};
+    uint8_t command = 0x8C;
+    pmbus_utils::SensorDataFormat format{
+        pmbus_utils::SensorDataFormat::linear_16};
+    std::optional<int8_t> exponent{-8};
+    PMBusReadSensorAction action{type, command, format, exponent};
+    EXPECT_EQ(action.getCommand(), 0x8C);
+}
+
+TEST(PMBusReadSensorActionTests, GetExponent)
+{
+    pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::iout};
+    uint8_t command = 0x8C;
+    pmbus_utils::SensorDataFormat format{
+        pmbus_utils::SensorDataFormat::linear_16};
+
+    // Exponent value is specified
+    {
+        std::optional<int8_t> exponent{-9};
+        PMBusReadSensorAction action{type, command, format, exponent};
+        EXPECT_EQ(action.getExponent().has_value(), true);
+        EXPECT_EQ(action.getExponent().value(), -9);
+    }
+
+    // Exponent value is not specified
+    {
+        std::optional<int8_t> exponent{};
+        PMBusReadSensorAction action{type, command, format, exponent};
+        EXPECT_EQ(action.getExponent().has_value(), false);
+    }
+}
+
+TEST(PMBusReadSensorActionTests, GetFormat)
+{
+    pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::iout};
+    uint8_t command = 0x8C;
+    pmbus_utils::SensorDataFormat format{
+        pmbus_utils::SensorDataFormat::linear_16};
+    std::optional<int8_t> exponent{-8};
+    PMBusReadSensorAction action{type, command, format, exponent};
+    EXPECT_EQ(action.getFormat(), pmbus_utils::SensorDataFormat::linear_16);
+}
+
+TEST(PMBusReadSensorActionTests, GetType)
+{
+    pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::pout};
+    uint8_t command = 0x8C;
+    pmbus_utils::SensorDataFormat format{
+        pmbus_utils::SensorDataFormat::linear_16};
+    std::optional<int8_t> exponent{-8};
+    PMBusReadSensorAction action{type, command, format, exponent};
+    EXPECT_EQ(action.getType(), pmbus_utils::SensorValueType::pout);
+}
+
+TEST(PMBusReadSensorActionTests, ToString)
+{
+    // Test where exponent value is specified
+    {
+        pmbus_utils::SensorValueType type{
+            pmbus_utils::SensorValueType::temperature_peak};
+        uint8_t command = 0x8C;
+        pmbus_utils::SensorDataFormat format{
+            pmbus_utils::SensorDataFormat::linear_16};
+        std::optional<int8_t> exponent{-8};
+        PMBusReadSensorAction action{type, command, format, exponent};
+        EXPECT_EQ(action.toString(), "pmbus_read_sensor: { type: "
+                                     "temperature_peak, command: 0x8C, format: "
+                                     "linear_16, exponent: -8 }");
+    }
+
+    // Test where exponent value is not specified
+    {
+        pmbus_utils::SensorValueType type{pmbus_utils::SensorValueType::vout};
+        uint8_t command = 0x8C;
+        pmbus_utils::SensorDataFormat format{
+            pmbus_utils::SensorDataFormat::linear_11};
+        std::optional<int8_t> exponent{};
+        PMBusReadSensorAction action{type, command, format, exponent};
+        EXPECT_EQ(action.toString(), "pmbus_read_sensor: { type: vout, "
+                                     "command: 0x8C, format: linear_11 }");
+    }
+}
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index a9ac996..b73c3a0 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -37,6 +37,7 @@
     'actions/if_action_tests.cpp',
     'actions/not_action_tests.cpp',
     'actions/or_action_tests.cpp',
+    'actions/pmbus_read_sensor_action_tests.cpp',
     'actions/pmbus_write_vout_command_action_tests.cpp',
     'actions/run_rule_action_tests.cpp',
     'actions/set_device_action_tests.cpp'
diff --git a/phosphor-regulators/test/pmbus_utils_tests.cpp b/phosphor-regulators/test/pmbus_utils_tests.cpp
index 8c28efd..4aab7db 100644
--- a/phosphor-regulators/test/pmbus_utils_tests.cpp
+++ b/phosphor-regulators/test/pmbus_utils_tests.cpp
@@ -100,6 +100,109 @@
     EXPECT_EQ(parameter, 0);
 }
 
+TEST(PMBusUtilsTests, ToString)
+{
+    // Sensor data format: SensorDataFormat::linear_11
+    {
+        pmbus_utils::SensorDataFormat format =
+            pmbus_utils::SensorDataFormat::linear_11;
+        EXPECT_EQ(pmbus_utils::toString(format), "linear_11");
+    }
+
+    // Sensor data format: SensorDataFormat::linear_16
+    {
+        pmbus_utils::SensorDataFormat format =
+            pmbus_utils::SensorDataFormat::linear_16;
+        EXPECT_EQ(pmbus_utils::toString(format), "linear_16");
+    }
+
+    // Sensor value type: SensorValueType::iout
+    {
+        pmbus_utils::SensorValueType type = pmbus_utils::SensorValueType::iout;
+        EXPECT_EQ(pmbus_utils::toString(type), "iout");
+    }
+
+    // Sensor value type: SensorValueType::iout_peak
+    {
+        pmbus_utils::SensorValueType type =
+            pmbus_utils::SensorValueType::iout_peak;
+        EXPECT_EQ(pmbus_utils::toString(type), "iout_peak");
+    }
+
+    // Sensor value type: SensorValueType::iout_valley
+    {
+        pmbus_utils::SensorValueType type =
+            pmbus_utils::SensorValueType::iout_valley;
+        EXPECT_EQ(pmbus_utils::toString(type), "iout_valley");
+    }
+
+    // Sensor value type: SensorValueType::pout
+    {
+        pmbus_utils::SensorValueType type = pmbus_utils::SensorValueType::pout;
+        EXPECT_EQ(pmbus_utils::toString(type), "pout");
+    }
+
+    // Sensor value type: SensorValueType::temperature
+    {
+        pmbus_utils::SensorValueType type =
+            pmbus_utils::SensorValueType::temperature;
+        EXPECT_EQ(pmbus_utils::toString(type), "temperature");
+    }
+
+    // Sensor value type: SensorValueType::temperature_peak
+    {
+        pmbus_utils::SensorValueType type =
+            pmbus_utils::SensorValueType::temperature_peak;
+        EXPECT_EQ(pmbus_utils::toString(type), "temperature_peak");
+    }
+
+    // Sensor value type: SensorValueType::vout
+    {
+        pmbus_utils::SensorValueType type = pmbus_utils::SensorValueType::vout;
+        EXPECT_EQ(pmbus_utils::toString(type), "vout");
+    }
+
+    // Sensor value type: SensorValueType::vout_peak
+    {
+        pmbus_utils::SensorValueType type =
+            pmbus_utils::SensorValueType::vout_peak;
+        EXPECT_EQ(pmbus_utils::toString(type), "vout_peak");
+    }
+
+    // Sensor value type: SensorValueType::vout_valley
+    {
+        pmbus_utils::SensorValueType type =
+            pmbus_utils::SensorValueType::vout_valley;
+        EXPECT_EQ(pmbus_utils::toString(type), "vout_valley");
+    }
+
+    // Vout data format: VoutDataFormat::linear
+    {
+        pmbus_utils::VoutDataFormat format =
+            pmbus_utils::VoutDataFormat::linear;
+        EXPECT_EQ(pmbus_utils::toString(format), "linear");
+    }
+
+    // Vout data format: VoutDataFormat::vid
+    {
+        pmbus_utils::VoutDataFormat format = pmbus_utils::VoutDataFormat::vid;
+        EXPECT_EQ(pmbus_utils::toString(format), "vid");
+    }
+
+    // Vout data format: VoutDataFormat::direct
+    {
+        pmbus_utils::VoutDataFormat format =
+            pmbus_utils::VoutDataFormat::direct;
+        EXPECT_EQ(pmbus_utils::toString(format), "direct");
+    }
+
+    // Vout data format: VoutDataFormat::ieee
+    {
+        pmbus_utils::VoutDataFormat format = pmbus_utils::VoutDataFormat::ieee;
+        EXPECT_EQ(pmbus_utils::toString(format), "ieee");
+    }
+}
+
 TEST(PMBusUtilsTests, ConvertToVoutLinear)
 {
     double volts;
