所以我正在尝试测试在命令处理程序中调用的异步任务类型的方法,在该方法中我有一些ifs,我想检查它去哪个分支。 因为在每个分支上调用了某个方法,所以我可以看到它去了哪个分支
await myRepository.Received(1).Method1(3, null);
Imagine the key method is like this:
public async Task MyKeyMethod(int x) {
if (x == 21)
Method1("bla");
if (x == 22)
Method2("blue");
if (x == 23)
Method3("ba");
}
所以我想测试调用 MyKeyMethod(2( 是否实际进入调用 Method2("蓝色"(的分支; 我知道我可以通过这样的事情来做到这一点: await MyKeyMethod.Received(1(.方法2(22(;Received(1( 表示该方法被调用过一次。
问题1:22应该是什么?提供给 Method2 的参数还是提供给 MyKeyMethod 的参数?
问题 2:为什么我的代码甚至没有输入命令处理程序中的任何异步 Task 方法(在调试期间(? 你有什么具体的例子吗?
我可以通过执行以下操作逐步输入命令:
var cmd = new MyCommand(myObject); // myObject is an object that I mocked earlier (gave it some dummy values for each field)
var commandResponse = await handler.Handle(cmd);
Assert.That(commandResponse.IsSuccessful, Is.True);
。只是不在下一个更深的级别,就像这些命令中的异步任务一样。我目前可以模拟异步任务返回的内容,在这种情况下这不是我想要的。
问题3.这可能是因为这些异步任务方法位于使用
myRepository = Substitute.For<IMyRepository>();
问题4.如何输入实际上不嘲笑在被模拟的存储库中找到的任务方法?
我仍然掌握它的窍门,"它"是 NUnit 中单元测试的更广泛主题,但显然我的预感是对的。由于存储库被模拟,我无法在其包含的方法之一中输入和调试。所以我使用了一个真正的(不是假的(存储库方法,顺便说一下,它在其构造函数中吸收了一些其他依赖存储库或服务的假实例,然后我可以进入该任务。 所以,事实上,而不是:
myRepository = Substitute.For<IMyRepository>();
我去创建了一个真实的实例,例如:
var myRepository = new MyRepository>(mockService1, mockRepo2);
其中 mockService1 是使用 Substitute 模拟的,如前所述。
通过这样做,我可以调试如下方法:myRepository.MyMethod(x)
以前调试器无法分析内部。
如果您有更好的方法来表达我的结论,无论如何,或者更完整的解释,请继续。谢谢