Gur*_*epS 8 unit-testing mocking
如果我要写一个模拟库,这将如何工作(换句话说,"它们如何工作?"?
我想知道的一件事是你总是设定期望,所以你需要将期望与方法在运行时所做的比较,所以我假设需要反射(在运行时解析类型).
此外,当使用术语"模拟对象"时,对象是否被删除或者它是否是具有预设期望的对象?
当我想我将如何编写自己的框架/技术实现时,比如模拟对象,我意识到我真正了解(或者不知道)以及我会踩到什么:如果模拟对象是预先编程的返回设定的期望而你不调用实际的真实对象,那么结果总是不一样吗?例如:
[TestMethod, Isolated]
public void FakeReturnValueByMethodArgs()
{
var fake = Isolate.Fake.Instance<ClassToIsolate>();
// MethodReturnInt will return 10 when called with arguments 3, "abc"
Isolate.WhenCalled(()=> fake.MethodReturnInt(3, " abc")).WithExactArguments().WillReturn(10);
// MethodReturnInt will return 50 when called with arguments 3, "xyz"
Isolate.WhenCalled(()=> fake.MethodReturnInt(3, "xyz")).WithExactArguments().WillReturn(50);
Assert.AreEqual(10, fake.MethodReturnInt(3, "abc"));
Assert.AreEqual(50, fake.MethodReturnInt(3, "xyz"));
Run Code Online (Sandbox Code Playgroud)
}
这总不会真的回归吗?
使用模拟框架的想法是模拟依赖项,而不是测试中的实际类.对于您的示例,您的测试将始终返回true,因为实际上您只测试模拟框架而不是您的实际代码!
真实世界的模拟看起来更像是这样的:
[TestMethod, Isolated]
public void FakeReturnValueByMethodArgs() {
var fake = Isolate.Fake.Instance<DependencyClass>();
// MethodReturnInt will return 10 when called with arguments 3, "abc"
Isolate.WhenCalled(()=> fake.MethodReturnInt(3, "abc")).WithExactArguments().WillReturn(10);
var testClass = new TestClass(fake);
testClass.RunMethod();
// Verify that the setup methods were execute in RunMethod()
// Not familiar with TypeMock's actual method to do this...
IsolatorExtensions.VerifyInstanceWasCalled(fake);
// Or assert on values
Assert.AreEqual(10, testClass.AProperty);
}
Run Code Online (Sandbox Code Playgroud)
注意mock如何传递给TestClass并在其上运行一个方法.
您可以阅读The Mocking来更好地了解模拟是如何工作的.
更新:解释为什么您只测试模拟框架:
你所做的是MethodReturnInt使用模拟框架创建一个方法Isolate.WhenCalled().当你MethodRecturnInt在Assert中调用时,代码将运行委托() => fake.MethodReturnInt()并返回10.模拟框架有效地创建了一个方法(虽然是动态的),看起来像这样:
public void MethodReturnInt(int value, string value2) {
Assert.Equal(3, value);
Assert.Equal("abc", value2);
return 10;
}
Run Code Online (Sandbox Code Playgroud)
它比这复杂一点,但这是一般的想法.由于除了创建2个方法之外从未运行任何代码然后在这两个方法上断言,因此您不会测试自己的代码,因此只测试模拟框架.
| 归档时间: |
|
| 查看次数: |
6333 次 |
| 最近记录: |