gpt4 book ai didi

unit-testing - 模拟框架如何工作?

转载 作者:行者123 更新时间:2023-12-04 07:46:10 24 4
gpt4 key购买 nike

如果我要编写一个模拟库,这将如何工作(换句话说,“它们如何工作?)?

我想知道的一件事是你总是在设定期望,所以你真的需要将期望与方法在运行时所做的进行比较,所以我假设需要反射(在运行时解析类型)。

此外,当使用术语“模拟对象”时,该对象是被删除还是会是具有预设期望的对象?

当我考虑如何编写自己的框架/技术实现(例如模拟对象)时,我意识到我真正知道(或不知道)有多少以及我会遇到什么:如果模拟对象是预先编程的返回设定的期望并且您不调用实际的真实对象,那么结果不会总是相同吗?例如:

[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"));

}

这不会总是返回 true 吗?

最佳答案

模拟框架的想法是模拟依赖关系,而不是实际测试的类。对于您的示例,您的测试将始终返回 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);
}

请注意模拟是如何传递到 TestClass 以及在其上运行的方法的。

您可以阅读 The Purpose of Mocking更好地了解模拟是如何工作的。

更新:解释为什么您只测试模拟框架:

你所做的是创建一个方法 MethodReturnInt使用 Isolate.WhenCalled() 的模拟框架.当您调用 MethodRecturnInt在 Assert 中,代码将运行委托(delegate) () => fake.MethodReturnInt()并返回 10。模拟框架正在有效地创建一个方法(尽管是动态的),看起来像这样:
public void MethodReturnInt(int value, string value2) {
Assert.Equal(3, value);
Assert.Equal("abc", value2);
return 10;
}

它比这更复杂一些,但这是一般的想法。由于除了创建 2 个方法然后对这两个方法进行断言之外,您从不运行任何代码,因此您没有测试自己的代码,因此只测试了模拟框架。

关于unit-testing - 模拟框架如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2277039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com