我应该断言验证方法已经执行了吗
本文关键字:执行 断言 验证 方法 我应该 | 更新日期: 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
是没有意义的。