【问题标题】:How to unit test this function?如何对这个功能进行单元测试?
【发布时间】:2021-03-31 14:58:09
【问题描述】:

我正在尝试为以下代码编写单元测试:

这是我的逻辑

public async Task RemoveUser(string id)
{
    var response = await _graphQLClient.SendMutationAsync<Response>(request);
    if (response.Errors != null)
    {
         throw new ClientException(errorMessages);
    }
}

这是我的单元测试

[Test]
public void RemoveUser_ShouldCancelUserOnSucessfulRemoval()
{
     _mockGraphQLClient
                .Setup(client => client.SendMutationAsync<object>(It.IsAny<GraphQLRequest>(), It.Is<CancellationToken>(token => token == default)))
                .ReturnsAsync( new GraphQLResponse<object>());

     var psClient = new PsClient(_mockGraphQLClient.Object);
     var removeUserResults = psClient.RemoveUser(id);
     Assert.AreEqual(removeUserResults, /* what to put here? */ );
}

我不知道应该比较我的结果吗?

以及如何处理:

?

【问题讨论】:

  • 费德里克;为什么你删除了大部分问题?就像现在一样,质量非常低,不太可能帮助别人。最初提供的代码为其他人提供了更多与他们自己的问题相关的上下文。
  • 我恢复了您的编辑,以挽救问题并保持其质量。

标签: c# unit-testing asp.net-core async-await graphql


【解决方案1】:

如果您在单元测试中使用异步任务,最好将您的测试函数也设为任务。

幸运的是框架支持这一点。

添加async 也会给您带来await 的好处。

public async Task RemoveUser_ShouldCancelUserOnSucessfulRemoval()
{
   //...

   await psClient.RemoveUser(id);
   //nothing thrown, all okay --- not really the best test case
}

通常你会断言一些响应:

public async Task RemoveUser_ShouldCancelUserOnSucessfulRemoval()
{
   //...

   var result = await psClient.RemoveUser(id);

   //Assert(result);
}

或者更多的集成方式;

public async Task RemoveUser_ShouldCancelUserOnSucessfulRemoval()
{
   //...

   var removeResult = await psClient.RemoveUser(id);

   var queryResult = await psClient.GetUser(id);

   //assert user is gone
}

【讨论】:

  • 如果我这样做会抛出一个错误,无法将 void 分配给隐式类型变量。
  • 啊,抱歉,您的 RemoveUserId 没有返回任何内容。你想测试什么结果?
  • 如果你想测试没有异常,上面的代码就可以了。您将被await 调用,任何抛出的异常都将导致您的测试失败。要测试用户是否被删除,您需要比较数据集。这有点复杂。
  • @Fedrick,断言在异步测试方法和 void 方法中没有什么不同。正如 Stefan 所说,等待任务,像往常一样做你的断言。从字面上看,唯一的区别是使方法“异步任务”而不是 void 并在调用被测方法时等待结果。其余代码应该非常相同。此外,如果您的测试用例是您没有得到异常,那么您不要断言。你只是让它运行(MethodUnderTest_RegularScenario_NoExceptions())。但是如果你的方法有输出,你编写测试来断言输出是什么。
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2021-10-12
  • 2022-11-29
  • 2018-03-30
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多