我是新来使用Moq
与Xunit
在Visual Studio 2019。
我想模拟测试类的构造函数中正在调用的类的构造函数调用。我的问题的简单演示:
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
?
我认为您可能需要稍微修改代码。您会看到,从接口的其他部分实例化接口本身本身并不会自动更改其他实现的行为。通常,您希望通过Dependency Injection将模拟的实现注入经过测试的代码中。
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();
}
然后,您将需要设置依赖注入容器,以便MockedClass
在实际应用程序代码运行时为您提供具体的信息。根据您的代码和要求,会有很多选项,因此在这里我不建议使用特定的框架。
从理论上讲,您可以在当前代码结构中模拟出该类。我有可能看到您如何选择假货或奇特的反射技术。但是,它可能会为克服似乎是社区公认的最佳实践而付出很多努力。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句