C# 测试 - 构造函数调用中的模拟类

标签 c# unit-testing moq xunit

我刚开始在 Visual Studio 2019 中将 MoqXunit 结合使用。

我想模拟在我的测试类的构造函数中调用的类的构造函数调用。 我的问题的简单演示:

public class MockedClass : IMockedClass
{
   public MockedClass()
   {
      // don't call this
   }
   public List<string> Function1()
   { /* return a List<string> here */ }
}
public class MyClass
{
   readonly IMockedClass mockedClass = null;
   public MyClass()
   {
      mockedClass = new MockedClass();
   }
   public string Function2()
   { /* return a string here */ }
}
public class MyClassTest
{
   [Fact]
   public string Function2Test()
   {
      var returnMock = new List<string>() { "1", "2", "3" };
      var mockMockedClass = new Mock<IMockedClass>();
      mockMockedClass.Setup(x => x.Function1()).Returns(returnMock);
      var myClass = new MyClass();
      var result = myClass.Function2();
      ...
   }
}

我的问题是,在测试Function2Test中,调用MyClass的构造函数来调用MockedClass的构造函数。 但我不希望调用 MockedClass 的构造函数。

如何模拟 MockedClass 的构造函数?

最佳答案

我认为您可能需要稍微修改一下您的代码。您会看到,获取接口(interface)的模拟本身并不会自动改变从代码的其他部分实例化时其他实现的行为方式。您通常希望通过 Dependency Injection 将模拟实现注入(inject)到测试代码中.

public class MyClass
{
    readonly IMockedClass mockedClass = null;
    public MyClass(IMockedClass c)
    {
        mockedClass = c; // now you'll get the correct implemetation
    }
    public string Function2()
    { /* return a string here */ }
}
void Main()
{

        var returnMock = new List<string>() { "1", "2", "3" };
        var mockMockedClass = new Mock<IMockedClass>(); // get your mock here
        mockMockedClass.Setup(x => x.Function1()).Returns(returnMock);
        var myClass = new MyClass(mockMockedClass.Object); // inject it here
        var result = myClass.Function2();
}

然后,您需要设置依赖注入(inject)容器,以便在实际应用程序代码运行时为您提供具体的 MockedClass。根据您的代码和要求,有 heaps of options所以我不会在这里推荐特定的框架。

理论上,您可以在当前的代码结构中模拟该类。我可能会看到你如何选择 Fakes或奇特的反射技巧。然而,违背社区公认的最佳实践可能需要付出很大的努力。

关于C# 测试 - 构造函数调用中的模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60240814/

相关文章:

c# - 单元测试 : How to test generic repository

c# - 数组作为字典键会产生很多冲突

使用 C 中的单元测试进行更正

c# - 如何将字符串分成字符

unit-testing - Grails 单元测试 Buggy 动态查找器

java - 大多数类似 MySQL 的与 hibernate 兼容的内存数据库?

c# - 在单元测试情况下检查 DefaultHttpContext 主体

c# - 模拟 IIndex<TKey, TValue>

c# - 如何停止windows窗体上的闪烁?

c# - 纯 asp.net Web API 应用程序