显式地将测试设置为通过/失败

本文关键字:失败 设置 测试 | 更新日期: 2023-09-27 18:16:40

在下面的测试中,如果它进入catch块,我想表明测试已经通过。如果绕过了catch块,我希望测试失败。

是否有一种方法可以做到这一点,或者我是否错过了测试应该如何结构化的要点?

[TestMethod]
public void CommandExecutionWillThrowExceptionIfUserDoesNotHaveEnoughEminence()
{
    IUserCommand cmd = CreateDummyCommand("TEST", 10, 10);
    IUser user = new User("chris", 40);
    try
    {
        cmd.Execute(user);
    }
    catch(UserCannotExecuteCommandException e)
    {
        //Test Passed
    }
    // Test Failed
}

显式地将测试设置为通过/失败

当我遇到类似的情况时,我倾向于使用这种模式:

// ...
catch (UserCannotExecuteCommandException e)
{
    return;    // Test Passed
}
Assert.Fail();    // Test Failed -- expected exception not thrown

声明测试抛出UserCannotExecuteCommandException,当这种情况发生时,测试将成功

[ExpectedException( typeof( UserCannotExecuteCommandException) )]

我建议使用Assert.Throws()方法:

Assert.Throws<UserCannotExecuteCommandException>() => cmd.Execute(user));

Id做你需要的一切。它期望在执行cmd.Execute()方法时抛出类型为UserCannotExecuteCommandException的异常,否则会自动将测试标记为失败。

由于[ExpectedException(...)]被认为是一个不好的做法,您可以使用:

  • MSTest: Assert.ThrowsException<UserCannotExecuteCommandException >( () => cmd.Execute(user) );
  • NUnit: Assert.Throws<UserCannotExecuteCommandException >( () => cmd.Execute(user) );

,那么你就可以指出哪一行应该抛出异常。