NUnit - 断言异常和属性

时间:2010-07-02 10:56:12

标签: c# unit-testing nunit

我想断言抛出异常,然后检查抛出异常的一些属性。

我的印象是我可以做以下事情:

ICommand command = CreateCommandObj();
Assert.That( () => command.DoWork(), Throws.TypeOf<ArgumentException>(),                        
                     Has.Property("ParamName").EqualTo("myParam") &
Has.Property("Message").EqualTo("myMessage") );

然而,这甚至没有编译并查看Assert的预期参数。我看不出我怎么能这样做?我确定我之前已经使用过这个......

注意以上是一个人为的例子来说明这一点,忽略我正在寻找除了任何参数之外的方法的ArgumentException:)

任何帮助表示感谢。

1)无法将lambda表达式转换为'object'类型,因为它不是委托类型。

4 个答案:

答案 0 :(得分:7)

好的,排序。

我需要使用以下语法:

ICommand command = CreateCommandObj();
Assert.That( () => command.DoWork(), 
                   Throws.TypeOf<ArgumentException>()
                   .And.Message.Equals("MyMessage"));

这种方法允许我检查抛出异常的属性。我可以在Assert中添加任意数量的And或Or。

感谢大家的建议。

答案 1 :(得分:1)

您在方法上使用[ExpectedException]属性测试异常。 e.g。

[Test] 
[ExpectedException(typeof(InvalidOperationException))]
public void Test_SomeMethod()
{
    something.SomeMehthod();
}

您可以在ExpectedException属性的构造函数中设置预期异常的属性。

修改的 您还可以指定测试属性,如下所示:

[Test]
[ExpectedException(ExpectedException = typeof(InvalidOperationException), ExpectedMessage = "Somethings not right")]
public void Test_SomeMethond()
{
    something.SomeMehthod();
}

答案 2 :(得分:0)

尝试&amp;&amp; - 逻辑和按位和

修改

我认为你正在寻找Assert.Throws如果你正在使用约束接口。不确定如何断言消息。我认为旧的风格对于你想要完成的事情更清楚:

  try
  {
    command.DoWork();
    Assert.Fail("ArgumentException Expected");
  }
  catch (ArgumentException e)
  {
    Assert.AreEqual("Expected Message", e.Message);
  }

答案 3 :(得分:0)

您也可以这样做:

var exception = Assert.Throws<ArgumentException>(() => {
    command.DoWork();
});
Assert.AreEqual("myMessage", exception.Message);