断言被测系统应该抛出断言异常

时间:2018-06-07 18:19:10

标签: c# asp.net unit-testing

我正在创建一个扩展方法,该方法对对象执行测试以查看它是否具有特定的自定义属性。

我想为我的扩展方法创建一个单元测试。我如何断言扩展方法中的测试应该失败?

[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”的字段上有一个自定义属性,我需要声明它失败了。

2 个答案:

答案 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时。