单元测试设计问题

本文关键字:问题 单元测试 | 更新日期: 2023-09-27 18:01:18

我想对这个方法进行单元测试

public string Edit(int id)
{
   var item = _repository.Get(id);
   string json = _jsonConverotr.Convert(item);
   return json;
}

存储库将被模拟。但是jsonconverter是一个简单的类,用于将实体转换为json。

所以我的问题是,我也应该模拟jsonconverter类还是可以使用原始的?jsonconverter类在别处测试。

单元测试设计问题

如果您对jsonConverter进行了测试,那么您应该模拟它。只测试Edit方法并检查调用和结果是否如您所期望的那样。

模拟它的原因是,如果在jsonConverter中有一个错误,并且这个测试失败,您不知道在哪里寻找错误。如果您的jsonConverter测试得足够好,它将显示在其中一个jsonConverter测试中。你知道去哪里查找和修复错误

JSON转换器是你写的吗?如果没有,我也不会担心。

我看不出这个方法Edit(int id)的单元测试有什么意义。所有的业务逻辑都在存储库组件和jsonConverter中。

如果你已经有了这两个组件的单元测试覆盖率,那么你不需要对这个进行单元测试,但是如果你坚持100%的单元测试覆盖率,你应该模拟这两个组件。

考虑这个问题的一个有用的方法是:你想测试什么行为?您所追求的行为是给定一个有效的id,返回JSON对象。我推荐以下两种方法之一,这两种方法都不会模拟JSON转换:

  1. 按预期结果手工生成JSON,并断言它等于返回值。使用JsonConverter的事实是一个实现细节。您的测试不应该关心如何获取JSON。它只需要确保得到有效的JSON。
  2. 创建一个名为JSONResult的类,它有一个Object属性和一个ToJSON()方法。然后,您的方法可以返回一个JSONResult,您可以断言它的Object属性等于您从模拟存储库返回的对象。然后,您可以进行单独的测试,以确保ToJSON正确工作。(此外,这种方法看起来非常像ASP。. NET MVC方法在控制器上,这意味着你应该使用内置的JSONResult(派生自ActionResult)
考虑到这一点,我建议#2。这样测试起来更简洁,对正在发生的事情也更有描述性。