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;
}
}