Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否应该断言已执行验证方法?_C#_Unit Testing_Moq - Fatal编程技术网

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

C# 我是否应该断言已执行验证方法?,c#,unit-testing,moq,C#,Unit Testing,Moq,我有一个关于为现有代码编写的单元测试的问题 在代码中完成了一些输入验证。验证的代码在一个单独的类中,因此测试中的代码调用ComponentValidator.Validate(request) 问题是:我是否应该单元测试在测试代码中是否调用了验证方法(在ComponentValidator类上)? 我不知道该怎么想:一部分说“是的,这很重要,所以请检查它”,另一部分说“不,您不应该测试该方法执行的每一行代码,因为这样我就在我的单元测试中非常依赖于实现” 如果没有,问题到此结束,但是如果我应该,有

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

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

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

我不知道该怎么想:一部分说“是的,这很重要,所以请检查它”,另一部分说“不,您不应该测试该方法执行的每一行代码,因为这样我就在我的单元测试中非常依赖于实现”

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


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

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

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

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

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


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

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

我的意思是:

int SomeMethod(someparams)
{
if(Validator.arefalid(params))
{
return-1;//或抛出或错误代码,或任何您要测试的代码
} 
//做些工作
//返回一些结果
}

现在编写两个测试。一个参数有效,一个参数无效。 然后测试您的方法在这两种情况下都返回了它应该返回的内容。在我看来,在内部调用验证器是实现细节


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

我在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
在这种情况下没有意义。

不确定我是否理解正确,但。。。难道你不能设置一个无效的输入状态并确保验证器捕捉到它吗?也就是说,没有模仿,但是使用真实的东西。是的,但是验证器是在一个单独的单元测试中测试的。所以在这个测试中,我假设它可以工作,我只想确保验证程序被调用。(至少,这是我的问题:我应该单元测试验证器是否被调用,或者我是否与实现有很大的关联?)您不需要替换验证测试,只需将其用作已被调用的标志。
someMethod()
{
  TestHelper.TryValidate(model); // TestHelper is another class where validation is being done
  if(model.IsValid)
  {
      return true;
  }
  else
  {
    return false;
  }

}