【问题标题】:ExpectedException in NUnit SetUpNUnit 设置中的 ExpectedException
【发布时间】:2010-11-19 08:44:52
【问题描述】:

我正在使用 NUnit 和 Rhino Mocks。我使用 AAA 语法,并在 setup 方法中执行 Arrange 和 Act,每个 Test 方法都是一个 Assert。

[TestFixture]
public class When_subSystem_throws_exception
{
    SomeClass subject; // System under test

    [SetUp]
    public void Setup()
    {
        // Arrange
        IDependency dependency = MockRepository.GenerateStub<IDependency>();
        dependency.Stub(m => m.DoStuff()).Throw(new Exception()); // This method is called from within SomeMethod()

        subject = new SomeClass(dependency);

        // Act
        subject.SomeMethod("Invalid Input");
    }

    // Assert

    [Test]
    public void should_log_an_exception_to_the_logger()
    {
        // Do stuff to verify that an exception has been logged
    }

    // More tests
}

如您所料,SomeMethod() 中的代码会抛出异常(如预期的那样),这会使每个测试都失败(不需要)。我通过这样做来解决这个问题

try
{
    // Act
    subject.SomeMethod("Invalid Input");
}
catch(Exception ex)
{
    // Swallow, this exception is expected.
}

但这太丑了。

我想做的是

[SetUp]
[ExpectedException]  // <-- this works for Test methods, but not for SetUp methods
public void Setup()
{
    // etc...
}

但我找不到类似的东西。

你知道什么吗?

【问题讨论】:

    标签: c# unit-testing nunit


    【解决方案1】:

    我不认为使用像ExpectedException 这样的属性是个好主意。 SetUp 是为测试方法准备一些东西,它不应该抛出异常。 如果必须抛出,并且要限制代码行数。然后将它们放在一行中,如下所示:

    try { subject.SomeMethod("Invalid Input"); }catch { }
    

    【讨论】:

    • 如何保证异常已经被抛出?
    • @Simone 对不起,我不明白你在说什么。
    • 如果你想测试是否抛出异常,你怎么能用这样的代码来检查呢?如果它被抛出,你所做的与它没有被抛出没有什么不同。
    • +1 简单地使它成为一个单线(当我得到代表 xD 时)。没想到。
    • @Simone,我不想测试是否抛出异常,我确保它是使用模拟在该方法中的某个地方抛出的(我看到我的问题并不清楚,会更新它)。我要测试的是抛出异常(如日志记录)时发生的事情。
    【解决方案2】:

    它在安装程序中不起作用是有原因的,而不是因为 NUnit 的错误。

    对于单元测试来说,在 SetUp 方法中抛出异常是一种非常糟糕的做法。如果您正在测试预期结果为异常的特定场景,则应在 [Test] 方法中完成。您应该随后重新排列您的代码。

    【讨论】:

    • 我不知道为什么这是不好的做法。当我在 SetUp 中执行“Acts”时(这对我来说是给定的),在这些“Acts”中引发的预期异常自然也在 SetUp 中。我只是在寻找比 try-catch 更优雅的解决方案。
    【解决方案3】:

    你的“行动”步骤应该在测试方法而不是设置中。

    该设置用于设置测试的先决条件和常见对象 - 即常见或重复的“安排”步骤。

    每个测试方法都应该单独“执行”和“断言”(并且可能还需要针对测试进行额外的“安排”步骤)。

    【讨论】:

    • 嗯,我猜我的单元测试方式并不是真正的标准,是吗?我认为它是“NUnit 遇到 BDD”,它对我有用。这是我第一次遇到“问题”,通过一个简单的 try-catch 解决了。我正在寻找的是比 try-catch 更优雅的解决方案。 “行为”留在设置中:p。
    • 然后使用 try-catch,这是更“优雅”的解决方案(也是您唯一的选择)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2013-02-07
    • 2012-01-06
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多