在单元测试中调试异步任务时遇到问题,因为它未输入



所以我正在尝试测试在命令处理程序中调用的异步任务类型的方法,在该方法中我有一些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)以前调试器无法分析内部。

如果您有更好的方法来表达我的结论,无论如何,或者更完整的解释,请继续。谢谢

相关内容

最新更新