模拟内部函数的响应,但测试外部函数

本文关键字:测试 外部 函数 内部函数 响应 模拟 | 更新日期: 2023-09-27 18:33:36

我以这种方式设置了C#代码。

public class Client : IClient
{
    public string funcA()
    {
       var output = funcB(1);
       //Do something on output and produce finalResult
       return finalResult;
    }
    public string funcB(int x)
    {
         // Some operations on produces string result
         return result;
    }
}

我想模拟 funcB 输出,但让 funcA 根据 funcB 的输出按原样执行。

在我的测试类中,我执行以下操作:

public class MockClient
{
    private Mock<IClient> _mockClient;
    public MockClient()
    {
        _mockClient = new Mock<IClient>();
    }
    [TestMethod]
    public void TestClient()
    {
        _mockClient.Setup(foo => foo.funcB(It.IsAny<int>())).Returns("test");
        var testOutput = _mockClient.Object.funcA();
    }
}

变量 testOutput 返回 NULL。我明白为什么,因为对象是从接口创建的。我不确定如何解决此问题。对此的任何投入都将有所帮助。

模拟内部函数的响应,但测试外部函数

我假设您正在根据语法使用最小起订量?如果是这样,您可以使用"部分模拟"。例:

将函数 B 更改为虚拟

public virtual string funcB(int x)
{
    // Some operations on produces string result
    return result;
}

然后模拟具体类型并将 CallBase 属性设置为 true:

[TestMethod]
public void TestClient()
{
    Mock<Client> _mockClient = Mock<Client>();
    _mockClient.CallBase = true;
    _mockClient.Setup(foo => foo.funcB(It.IsAny<int>())).Returns("test");
    var testOutput = _mockClient.Object.funcA();
}

上面的例子在 Moq 语法中是完全正确的。但是使功能虚拟化与否 - 这是基于您,客户等目的和需求的生产决策。将 funcB 更改为虚拟仅用于测试 - 听起来不合理。

您可以使用 Typemock 隔离器来测试原始代码,请参阅:

     public class Client : IClient
     {
        public string funcA()
        {
            var output = funcB(1);
            //Do something on output and produce finalResult
            var finalResult = "B result: " + output;
            return finalResult;
        }
        public string funcB(int x)
        {
            // Some operations on produces string result
            return "result";
        }
    }
    [TestMethod, Isolated]
    public void TestMethod()
    {
        //Arrange
        var foo = new Client();
        Isolate.WhenCalled(() => foo.funcB(0)).WillReturn("test");
       //Act
       var output = foo.funcA();
       //Assert
       Assert.AreEqual("B result: test", output);
   }