C#如何进行Xunit测试 - 任务无返回值方法

3

我有一个函数,可以将数据保存到couch db数据库中,它是一个无返回值的任务方法。我想进行单元测试,但出现了意料之外的错误...

我尝试断言返回类型为任务类型,但不起作用。

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]]

请阅读此帖子 https://dev59.com/6mMm5IYBdhLWcg3wKscj。这些类型有所不同,但它们都与异步方法的返回值有关。 - Johnny
@Johnny,我明白它们不同了,那么我该怎么断言它将返回一个VoidTaskResult? - Ivan Apungan
我知道一种方式,虽然不是很优雅,但或许可以帮助:Assert.Equal("System.Threading.Tasks.VoidTaskResult", messageHistoryService.CreateMessageHistoryAsync(message).GetType().GetProperty("Result")?.GetMethod.Invoke(t, new object[] { })?.GetType().FullName); - Johnny
1个回答

4
你的async方法返回的Task是由编译器生成的。它可能是Task的实例,也可能是派生类型的实例。这在以后的更新中可能会发生变化。你不希望特别检查Task类型;这将把你的单元测试与实现细节绑定在一起。
你可以测试“这是Task还是派生类型吗?”,看起来像这样:await Assert.IsAssignableFrom<Task>(messageHistoryService.CreateMessageHistoryAsync(message)); 但是,我认为这根本不是一个有用的断言。断言一个返回T的方法实际上返回了T(或派生类型)是没有意义的,因为它当然会返回T!因此,我建议完全删除该断言:await messageHistoryService.CreateMessageHistoryAsync(message);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接