2

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

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

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

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

如果不是,问题到此结束,但如果我应该,有没有办法检查调用是否在我的单元测试中进行,而不为验证器创建接口并模拟它?

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

4

3 回答 3

1

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

假设验证器工作正常,我不需要测试验证器是否被正确调用。考虑以下问题以及您将如何处理:

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

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

编辑:当然,答案也取决于您要测试的单元。也许如果您可以在此处粘贴该单元,则提供更准确的答案会更容易

于 2013-07-26T08:48:56.213 回答
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 是实现细节。

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

于 2013-07-26T08:59:58.993 回答
0

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

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

}

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

于 2013-08-14T18:20:03.337 回答