在单元测试中调试异步任务有问题,因为它没有输入

问题描述 投票:0回答:1

所以我试图测试一个在命令处理程序内部调用的异步任务类型的方法,在该方法中我有一些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的分支(“blue”);我知道我可以通过以下方式做到这一点:等待MyKeyMethod.Received(1).Method2(22); // Received(1)表示方法被调用一次。

问题1:22应该是什么?提供给Method2的参数或提供给MyKeyMethod的参数?

问题2:为什么我的代码甚至没有在命令处理程序中输入任何异步任务方法(在调试期间)?你有什么具体的例子吗?

我可以通过执行以下操作逐步输入命令:

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.如何进入实际上并非嘲弄地在被模拟的存储库中找到的任务方法?

unit-testing nunit
1个回答
0
投票

我仍然掌握它,“它”是NUnit中更广泛的单元测试主题,但显然我的预感是正确的。由于存储库被模拟,我无法在其包含的方法之一中输入和调试。所以我使用了一个真实的(非假的)存储库方法,顺便在其构造函数中获取了一些其他依赖存储库或服务的虚假实例,然后我可以进入该任务。所以,事实上,而不是:

myRepository = Substitute.For<IMyRepository>();

我去创建了一个真实的实例,例如:

var myRepository = new MyRepository>(mockService1, mockRepo2);

其中mockService1使用Substitute嘲笑,就像之前指出的那样。

通过这样做,我可以调试一个方法,如:myRepository.MyMethod(x),以前调试器无法分析内部。

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

© www.soinside.com 2019 - 2024. All rights reserved.