C#如何进行Xunit测试-任务无效方法

时间:2019-01-15 11:19:18

标签: c# .net xunit xunit.net

我有一个保存到沙发数据库数据库的函数,这是一个Task Void方法,它不返回任何内容,并且我想对其进行单元测试,但是它给出了我不希望看到的错误...

我尝试断言返回是一种Task类型,但是它不起作用

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

1 个答案:

答案 0 :(得分:1)

您的Task方法返回的async由编译器生成。它可以是Task的实例,也可以是派生类型的实例。而且这可能会随着将来的更新而改变。您不想专门检查Task类型;会将您的单元测试与实现细节联系起来。

您可以测试“是Task还是派生类型?”,看起来像await Assert.IsAssignableFrom<Task>(messageHistoryService.CreateMessageHistoryAsync(message));

但是,我认为这根本不是一个有用的主张。断言返回T的方法实际上返回T(或派生类型)是没有用的,因为当然它返回T!因此,我建议完全删除该断言:await messageHistoryService.CreateMessageHistoryAsync(message);