我最近使用装饰器模式解决了我的一个问题。一切正常,一切都解耦(或者我认为),我能够分别对每个有效字段进行单元测试。
我的问题是,如果NameValidator和AgeValidator都传递了Validate()和IsValid()(抽象)函数的测试。我是否仍需要对我的ValidationDecorator类进行单元测试(尚未创建)? ValidationDecorator将负责为每个验证类装饰我的验证器。
public abstract class FieldValidator
{
protected IMessage validateReturnType;
public FieldValidator() { }
public bool IsValid()
{
return (validateReturnType.GetType() == typeof(Success));
}
}
public class NameValidator : FieldValidator, IValidator
{
private string name;
public NameValidator(string _name) {
name = _name;
}
public IMessage Validate()
{
if (name.Length < 5)
{
validateReturnType = new Error("Name error.");
}
else
{
validateReturnType = new Success("Name no errror.");
}
return validateReturnType;
}
}
public class AgeValidator : FieldValidator, IValidator
{
private int age;
public AgeValidator(int _age)
{
age = _age;
}
public IMessage Validate()
{
if (age <= 18)
{
validateReturnType = new Error("Age error.");
}
else
{
validateReturnType = new Success("Age no errror.");
}
return validateReturnType;
}
}
public interface IValidator
{
IMessage Validate();
bool IsValid();
}
这是我的单元测试。
[TestFixture]
public class ValidatorTest
{
Type successType;
Type errorType;
Model m;
[SetUp]
public void SetUp()
{
successType = typeof(Success);
errorType = typeof(Error);
m = new Model();
m.Name = "Mike Cameron";
m.Age = 19;
m.Height = 325;
Validator v = new Validator();
v.Validate(m);
}
[Test]
public void ValidateNameTest()
{
IValidator im = new NameValidator(m.Name);
IMessage returnObj = im.Validate();
Assert.AreEqual(successType, returnObj.GetType());
}
[Test]
public void IsValidNameTest()
{
IValidator im = new NameValidator(m.Name);
IMessage returnObj = im.Validate();
Assert.IsTrue(im.IsValid());
}
[Test]
public void ValidateAgeTest()
{
IValidator im = new AgeValidator(m.Age);
IMessage returnObj = im.Validate();
Assert.AreEqual(successType, returnObj.GetType(), "Must be over 18");
}
[Test]
public void IsValidAgeTest()
{
IValidator im = new AgeValidator(m.Age);
IMessage returnObj = im.Validate();
Assert.IsTrue(im.IsValid());
}
谢谢。
答案 0 :(得分:4)
经验法则是“测试可能会破坏的一切”。现在,判断什么可能破坏在现实生活环境下远非微不足道。要做到正确需要实践和经验。并且不可能提供一般性建议,尤其是在没有看到您的设计和代码的情况下。
所以最后,只有你能够可靠地评估你是否有足够的信心ValidationDecorator
是如此微不足道,它永远不会破裂。如果有疑问,最好在太多测试中犯错:-)这意味着你花费一些额外的时间来完成一项可能不重要的任务。相反 - 未能编写所需的单元测试 - 意味着您可能会让错误通过您的网络,这通常是一个更大的问题。
答案 1 :(得分:1)
是的,您应该对可能包含错误的任何类进行单元测试。要对ValidationDecorator类进行单元测试,您应该使用IValidator的模拟或存根实现。