首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Nunit、C#中验证ArgumentException及其消息

在Nunit、C#中验证ArgumentException及其消息
EN

Stack Overflow用户
提问于 2013-07-24 00:51:17
回答 3查看 20.4K关注 0票数 35

在我的Nunit测试程序中,我想通过验证消息来验证它是否得到了写参数异常。

代码语言:javascript
复制
    [Test]
    public void ArgumentsWorkbookNameException()
    {
        const string workbookName = "Tester.xls";
        var args = new[] { workbookName, "Sheet1", "Source3.csv", "Sheet2", "Source4.csv" };
        Assert.Throws(typeof(ArgumentException), delegate { var appargs = new ApplicationArguments(args); }, "Invalid ending parameter of the workbook. Please use .xlsx");

    }

在测试之后,当我在主程序中修改消息时,这不起作用。

代码语言:javascript
复制
        int wbLength = args[0].Length;

        // Telling the user to type in the correct workbook name file.
        if (args[0].Substring(wbLength-5,5)!=".xlsx")
        {
            throw new ArgumentException(
                "Invalid ending parameter of the workbook. Please use .xlsx random random");
        }

无论我是否更改了消息,单元测试仍然通过。

我该怎么做呢?或者在C#中没有这样的东西。我的同事说在Ruby和RSPEC中有这样的选项,但他不是100%确定在C#上。

EN

回答 3

Stack Overflow用户

发布于 2015-01-15 02:17:44

使用fluent接口创建断言:

代码语言:javascript
复制
Assert.That(() => new ApplicationArguments(args), 
    Throws.TypeOf<ArgumentException>()
        .With.Message.EqualTo("Invalid ending parameter of the workbook. Please use .xlsx random random"));
票数 60
EN

Stack Overflow用户

发布于 2013-07-24 01:03:02

我同意Jon的观点,“这样的测试是不必要的脆弱”。但是,至少有两种方法可以检查异常消息:

1: Assert.Throws返回异常,可以对其消息进行断言:

代码语言:javascript
复制
var exception = Assert.Throws<ArgumentException>(() => new ApplicationArguments(args));
Assert.AreEqual("Invalid ending parameter of the workbook. Please use .xlsx random random", exception.Message);

2:在NUnit 3之前,您还可以使用ExpectedException属性。但是,请注意,属性等待整个测试代码中的异常,而不仅仅是抛出异常的代码。因此,不建议使用此属性。

代码语言:javascript
复制
[Test]
[ExpectedException(typeof(ArgumentException), ExpectedMessage = "Invalid ending parameter of the workbook. Please use .xlsx random random")]
public void ArgumentsWorkbookNameException()
{
    const string workbookName = "Tester.xls";
    var args = new[] { workbookName, "Sheet1", "Source3.csv", "Sheet2", "Source4.csv" };
    new ApplicationArguments(args);
}
票数 30
EN

Stack Overflow用户

发布于 2021-04-20 19:38:39

在.NET Core3.1 MSTest项目中,我就是这样做的。

代码语言:javascript
复制
[TestMethod]
public async Task SaveItemAsync_NameIsNull_ThrowsException()
{
    var item = new Item
    {
        Name = null
    };

    var result = await Assert.ThrowsExceptionAsync<ArgumentException>(() => _service.SaveItemAsync(item));
    Assert.AreEqual("The item's name must be set.", result.Message);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17816285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档