gpt4 book ai didi

c# - 对于在单独线程 (Task.Run) 上运行的异步方法,MustHaveHappened 断言总是失败

转载 作者:太空宇宙 更新时间:2023-11-03 19:47:32 25 4
gpt4 key购买 nike

我有一个方法:

public class MyClass
{
public ILogger _logger;

public async void TestLogMethod(string msg)
{
await Task.Run(async ()=> await _logger.Log(msg));
}
}

还有一个测试用例:

[Test]
public async Task TestLogMethod_LogMessage_Test()
{
var fakeLogger = A.Fake<ILogger>();
var testClass = new MyClass();
testClass._logger = fakeLogger;

testClass.TestLogMethod("Test Message");

A.CallTo(() => fakeLogger.Log(A<string>._)).MustHaveHappened();
}

MustHaveHappened 断言总是失败

Assertion failed for the following call:
MyClass.TestLogMethod<System.Object>(<Ignored>)
Expected to find it at least once but no calls were made to the fake object.

明明调用了_logger.Log(),但为什么这里Asserting总是失败?

最佳答案

您不是在等待 TestLogMethod 完成,所以您是在期望发生之前验证它。 Task 将在线程池上进行调度,然后该方法将立即返回。这就是为什么你应该 avoid async void方法。

更改返回一个Task 的方法,这样您就可以await 了。您还可以在此处删除大部分 asyncawait 对,因为它们是多余的:

public Task TestLogMethod(string msg)
{
return Task.Run(() => _logger.Log(msg));
}

然后在您的测试中await:

await testClass.TestLogMethod("Test Message");

然后当验证发生时,将发生对 ILogger.Log 的调用。

关于c# - 对于在单独线程 (Task.Run) 上运行的异步方法,MustHaveHappened 断言总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545656/

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