我正在尝试使用TDD,我已经阅读了一些教程,并尝试在我使用流畅验证创建的验证类上实现测试。
public SomeFormValidator()
{
RuleFor(x => x.MyClass).NotNull()
.WithMessage("MyClass cannot be null");
}
我专门研究了TDD示例以进行流畅验证并创建了几个测试
[Test]
public void Should_have_error_when_MyClass_is_null()
{
MyClass myClass = null;
SomeFormValidator.ShouldHaveValidationErrorFor(aup => aup.MyClass, myClass);
}
[Test]
public void Should_not_have_error_when_MyClass_is_not_null()
{
MyClass myClass = new MyClass();
SomeFormValidator.ShouldNotHaveValidationErrorFor(aup => aup.MyClass, myClass);
}
我现在想测试字符串“MyClass不能为null”,当它为null时返回。我无法找到任何覆盖返回消息的内容,但我无法解决这个问题。
答案 0 :(得分:3)
感谢@Surgey的指导,我能够提出一个使用流畅的验证内置方法的解决方案,除此之外,我已经能够更好地布局我在下面添加的测试
result.WithErrorMessage
}
我正在使用Assert.AreEqual
因为结果中提供了这个,但是我已经离开了foreach,但发表了评论,因为我发现使用{{1}}生成的错误消息会产生更好的消息试验跑步者。
答案 1 :(得分:1)
有Arrange-Act-Assert(AAA)技术,有助于正确构建单元测试。
首先,您需要创建一个受测试系统(SUT)和输入。在这种情况下,SomeFormValidator
和SomeForm
个实例:
// arrange
var sut = new SomeFormValidator();
var someFormWithNullProp = new SomeForm { MyClass = null };
然后你需要调用SUT来执行实际工作。对于validators,这是Validate()
方法调用:
// act
ValidationResult result = sut.Validate<SomeForm>(someFormWithNullProp);
单元测试的最后一部分检查实际结果是否符合预期:
// assert
Assert.False(result.IsValid);
Assert.AreEqual(
"MyClass cannot be null",
result.Errors.Single().ErrorMessage);