【问题标题】:Mocking a Private Object模拟私有对象
【发布时间】:2020-08-04 14:34:18
【问题描述】:

我正在使用 C# 进行测试。我正在尝试从参考中模拟一个函数(使用 Moq)。以下是所提供代码的简化版本。

B.cs:

public class DeviceB:
    public DeviceB():
        // do some stuff
        return something;

A.cs:

using B;
public class DeviceA:
    private static DeviceB deviceB;

    public DeviceA():
        deviceB = DeviceB();

要测试DeviceA 类,我想模拟DeviceB() 以改变deviceB 的行为。

我相信这应该是可能的,但我不知道怎么做。如果您有任何想法或建议,请告诉我。 (我最好使用 Moq vscode nuget,但我愿意接受替代方案。)

【问题讨论】:

  • 在我看来你需要学习起订量。他们没有在他们的库中提供一些示例吗?
  • @RobertHarvey 是的,他们提供了很多示例 (github.com/Moq/moq4/wiki/Quickstart),但我找不到与我的问题相关的内容,也因为 deviceB 是私有的。
  • 如果您提供一些实际代码,而不仅仅是一堆伪代码,您的问题可能会更容易得到回答。特别是如何注入 DeviceB 的实例在这里很重要。

标签: c# mocking moq


【解决方案1】:

你有两个选择

声明DeviceB类的virtual方法并将其传递给deviceA。

class DeviceB
{
    public virtual void method1()
    {
        // Code [..]
    }
}

class DeviceA
{
    private DeviceB _deviceb;

    public DeviceA(DeviceB deviceb)
    {
       _deviceb = deviceb;
    }

    // More code [..]
}

class UnitTest
{
    [Fact]
    public void TestMethod1()
    {
        // Arrange
        var mock = new Mock<DeviceB>();
        mock.Setup(..);

        // Act
        var devA = new DeviceA(mock.Object);
        var result = devA.mymethod();

        // Assert
        Assert.....
    }
}

为DeviceB方法声明接口(更好)并在DeviceA上使用它而不是DeviceB;将具体的DeviceA注入DeviceB

interface IDeviceB
{
    void Method1();
    int AnotherMethod(int parm1);
}

class DeviceB : IDeviceB 
{
    // [..] Implementations
}


class DeviceA
{
    private IDeviceB _deviceB;

    public DeviceA(IDeviceB C)
    {
        _deviceB = deviceB;
    }
}

class UnitTest
{
     [Fact]
     public void TestMethod1()
     {
          // Arrange
          var mockedDeviceB = new Mock<IDeviceB>();
          mockedDeviceB.Setup(..);

          // Act
          var devA = new DeviceA(mockedDeviceB.Object);
          var result = devA.anotherMethod(1);

          // Assert
          Assert.....
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多