我应该断言验证方法是否已执行?

时间:2013-07-26 08:01:49

标签: c# unit-testing moq

我对我正在为现有代码编写的单元测试有疑问。

在代码中完成一些输入验证。验证的代码在一个单独的类中,因此测试中的代码调用ComponentValidator.Validate(request)

问题是:我应该单独测试在被测代码中调用validate方法(在ComponentValidator类上)吗?

我不确定该怎么想:一部分说“是的,重要的是检查它”,另一部分说“不,你不应该测试每一行代码该方法执行因为我在单元测试

中受到很多限制

如果没有,问题就在这里结束,但如果我应该,有没有办法检查调用是否在我的单元测试中进行,而不是为验证器创建一个接口并嘲笑它?

我知道我可以为验证器创建一个接口,在类中注入它并在测试期间使用Mock对象(我正在使用Moq),但我并不总是想这样做。

3 个答案:

答案 0 :(得分:1)

正如您所说验证器在单独的单元测试中进行测试,您可以假设验证器工作正常。

假设验证器工作正常,我不需要测试验证器是否正确调用。想想以下问题以及您将采取的措施:

“我单元测试了Console.WriteLine()方法,我应该测试它是否被正确调用”

从我的角度来看,如果调用验证器,你会进行测试。对调用Validator的模块进行单元测试应测试是否满足模块的用途。如果每个子呼叫都是正确的,那就不是了。

编辑:当然,答案还取决于您要测试的单位。也许如果你可以粘贴这个单位,那么提供更准确的答案会更容易

答案 1 :(得分:1)

想想当您测试的任何内容未通过/通过验证时会发生什么。并测试是否发生这种情况。您的代码调用另一个要验证的类并不重要。

我的意思是:

int SomeMethod(someparams)
{
   if (Validator.AreValid(params))
   {
        return -1; // or throw or error code or whatever that you will test for
   } 
   // do some work
   //return some result
}

现在你要写两个测试。一个有效,一个有无效的参数。 然后测试你的方法在两种情况下都返回了它应该的样子。在我看来,调用Validator是实现细节。

如果我不能在测试中使用真实的那个,我只会模拟Validator(例如,如果它必须去数据库读取验证规则)。

答案 2 :(得分:0)

我在MVC中看到了类似的情况,代码类似于此

someMethod()
{
  TestHelper.TryValidate(model); // TestHelper is another class where validation is being done
  if(model.IsValid)
  {
      return true;
  }
  else
  {
    return false;
  }

}

这里,只需传递测试数据,一旦它有效,一旦它无效,之后你可以验证结果是否返回预期的真/假。 在这种情况下,模拟TryValidate没有意义。