我对我正在为现有代码编写的单元测试有疑问。
在代码中完成一些输入验证。验证的代码在一个单独的类中,因此测试中的代码调用ComponentValidator.Validate(request)
。
问题是:我应该单独测试在被测代码中调用validate方法(在ComponentValidator类上)吗?
我不确定该怎么想:一部分说“是的,重要的是检查它”,另一部分说“不,你不应该测试每一行代码该方法执行因为我在单元测试“
中受到很多限制如果没有,问题就在这里结束,但如果我应该,有没有办法检查调用是否在我的单元测试中进行,而不是为验证器创建一个接口并嘲笑它?
我知道我可以为验证器创建一个接口,在类中注入它并在测试期间使用Mock对象(我正在使用Moq),但我并不总是想这样做。
答案 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
没有意义。