我应该断言验证方法已经执行了吗

本文关键字:执行 断言 验证 方法 我应该 | 更新日期: 2023-09-27 18:24:57

我有一个关于我正在为现有代码编写的单元测试的问题。

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

问题是:我是否应该对测试代码中调用的validate方法(在ComponentValidator类上)进行单元测试

我不知道该怎么想:一部分说"是的,这很重要,所以检查一下",另一部分说:"不,你不应该测试方法执行的每一行代码,因为那样我就在很大程度上受制于我的单元测试中的实现。"

如果没有,问题到此结束,但如果我应该这样做,是否有一种方法可以检查调用是否是在我的单元测试中进行的,而不必为验证器创建接口并嘲笑它?

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

我应该断言验证方法已经执行了吗

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

假设验证器工作正常,我不认为您需要测试验证器是否被正确调用。思考以下问题以及你会怎么做:

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

从我的角度来看,如果调用了验证器,那么测试就太深入了。对调用Validator的模块进行单元测试时,应测试模块的目的是否得到满足。如果每个子调用都正确进行,则不会。

编辑:当然,答案也取决于你想要测试的单元。也许如果你可以把单位粘贴在这里,就更容易提供更准确的答案

想想当你测试的东西没有通过/通过验证时会发生什么。并测试是否发生这种情况。代码调用另一个类进行验证并不重要。

我的意思是:

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(例如,若它必须去数据库读取验证规则),我只会嘲笑Validator。

我在MVC中看到过类似的场景,其中的代码类似于

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

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