我正在创建一个扩展方法,该方法对对象执行测试以查看它是否具有特定的自定义属性。
我想为我的扩展方法创建一个单元测试。如何断言扩展方法中的测试应该失败?
[Test]
public void ShouldFailIfEmailAttributeMissingFromFieldName()
{
//--Arrange
var model = new { Field = 1 };
//--Act
model.ShouldValidateTheseFields(new List<FieldValidation>
{
new EmailAddressFieldValidation
{
ErrorId = 1,
ErrorMessage = "Message",
FieldName = nameof(model.Field)
}
});
//--Assert
}
基本上,ShouldValidateTheseFields
进行反射并声明它应该在名为“Field”的字段上具有自定义属性,并且我需要断言它失败了。
赶上预期的例外。如果没有抛出则测试失败
[Test]
public void ShouldFailIfEmailAttributeMissingFromFieldName() {
//--Arrange
var model = new { Field = 1 };
//--Act
try {
model.ShouldValidateTheseFields(new List<FieldValidation> {
new EmailAddressFieldValidation {
ErrorId = 1,
ErrorMessage = "Message",
FieldName = nameof(model.Field)
}
});
} catch(MyExpectedException e) {
return;
}
//--Assert
Assert.Fail();
}
根据所使用的测试框架,应该有一种方法可以断言测试的预期异常,这基本上遵循上面的类似格式。
创建一个新的自定义异常,如果它缺少自定义属性,则抛出它:
[Test]
public void ShouldFailIfEmailAddressAttributeIsMissingFromFieldName()
{
//--Arrange
var model = new { Field = 1 };
//--Act
Should.Throw<EmailAddressAttributeNotFoundException>(() => model.ShouldValidateTheseFields(
new List<FieldValidation>
{
new EmailAddressFieldValidation
{
ErrorId = 1,
ErrorMessage = "Message",
FieldName = nameof(model.Field)
}
}));
}
要检查断言是否失败,您需要捕获断言异常。在这种情况下,由于正在使用Shouldly Framework,因此在扩展方法中抛出了一个Shouldly.ShouldAssertException:
[Test]
public void ShouldFailIfEmailAddressAttributeHasWrongErrorId()
{
//--Arrange
var model = new TestModelTwo();
//--Act
Should.Throw<ShouldAssertException>(() => model.ShouldValidateTheseFields(
new List<FieldValidation>
{
new EmailAddressFieldValidation
{
ErrorId = 2,
ErrorMessage = "Message",
FieldName = nameof(model.Field)
}
}));
}
使用课程:
public class TestModel
{
[EmailAddress(1)]
public string Field { get; set; }
}
扩展方法中的失败断言是ErrorId.ShouldBe(2),当它在模型上实际为1时。