我正在创建一个扩展方法,该方法对对象执行测试以查看它是否具有特定的自定义属性。
我想为我的扩展方法创建一个单元测试。我如何断言扩展方法中的测试应该失败?
[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”的字段上有一个自定义属性,我需要声明它失败了。
答案 0 :(得分:5)
抓住预期的例外情况。如果没有抛出,则测试失败
[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();
}
根据所使用的测试框架,应该有一种方法可以断言测试的预期异常,这基本上遵循上面的类似格式。
答案 1 :(得分:1)
创建一个新的自定义异常,如果它缺少自定义属性,则抛出它:
[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时。