c# - C# 如何进行 Xunit 测试 - 任务无效方法
问题描述
我有一个保存到沙发数据库数据库的函数,它是一个 Task Void 方法,它不返回任何内容,我想对其进行单元测试,但它给出了我没想到的错误......
我试过断言返回是一个任务类型,但它不起作用
public async Task CreateMessageHistoryAsync(Message message)
{
//This is the method that I am testing
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(await response.Content.ReadAsStringAsync());
}
//This will throw if it does not save, can I test this?
}
[Fact]
public async Task Should_NotThrowHttpRequestException_When_AMessageHistoryIsCreated()
{
var recipients = MockMessage.GetRecipients("Acc", "Site 1", "Site 2", "Site 3");
var message = MockMessage.GetMessage(recipients);
mockStateFixture
.MockMessageHistoryService
.Setup(service => service.CreateMessageHistoryAsync(message));
var messageHistoryService = new MessageHistoryService(
mockStateFixture.MockIHttpClientFactory.Object);
await Assert.IsType<Task>(messageHistoryService.CreateMessageHistoryAsync(message));
}
我希望任务返回,但这是实际结果:
结果消息:
Assert.IsType() Failure
Expected: System.Threading.Tasks.Task
Actual: System.Threading.Tasks.Task`1[[System.Threading.Tasks.VoidTaskResult, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]
解决方案
Task
从您的方法返回的值async
由编译器生成。它可能是 的实例Task
,也可能是派生类型的实例。这可能会随着未来的更新而改变。您不想专门检查Task
类型;这会将您的单元测试与实现细节联系起来。
您可以测试“这是此Task
类型还是派生类型?”,看起来像await Assert.IsAssignableFrom<Task>(messageHistoryService.CreateMessageHistoryAsync(message));
但是,我认为这根本不是一个有用的断言。断言返回 T 的方法实际上返回 T(或派生类型)是没有用的,因为它当然返回 T!因此,我建议完全删除该断言:await messageHistoryService.CreateMessageHistoryAsync(message);
推荐阅读
- android - 如何在颤动的后台运行飞镖代码?
- django - 使用相对 URL 路径和请求正文在内部调用 Django API
- laravel - 试图获取非对象的属性“first_name”
- python - 从 THREDDS 读取 netCDF 数据失败
- python - Python,numpy 相关返回 nan
- python - 我试图弄清楚如何制作一个正方形,单击它时它会改变颜色
- sql - 如何编写高效的 Cosmos DB 查询来搜索数组中的空值?
- python - 将 Horovod 与 tf.keras 一起使用时如何从检查点恢复?
- oracle11g - oracle 11g如何在同一个sid中导入多个dump文件?
- javascript - 如何以编程方式减小 Node/Javascript 中的 PDF 大小