2010-07-02 78 views
1

我想断言抛出异常,然后检查抛出的异常的一些属性。NUnit - 声明异常和属性

我的印象是,我可以做类似在以下:

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

然而,这并不甚至编译和看的Assert.That预期的参数,我不能看到我会怎样能够做到这一点?我敢肯定,我之前虽然用过这个...

注意上面是一个人为的例子来说明这一点,忽略了我在寻找一个方法一个ArgumentException只是任何参数,这并不事实:)

任何帮助表示赞赏。

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

回答

7

好的,已排序。

我需要使用的语法如下:

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

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

谢谢大家的建议。

+1

这几乎为我工作,但我不得不改变约束为'Throws.TypeOf ()。和.Message.StringMatching(“MyMessage”));'。我认为这是由于这篇文章发布后对NUnit框架所做的更改。 – robyaw 2014-03-20 14:00:51

0

尝试& & - 逻辑和位运算符和

编辑

我认为你正在寻找Assert.Throws如果您使用的约束接口。不知道你将如何断言消息。我认为旧样式对于您要实现的内容更清晰:

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

尝试过,但相同的编译问题。我想我正在混合一些东西,因为我看不到一个Assert.That方法超载,这将允许我做我想做的事情。 将编译错误消息添加到问题。 – 2010-07-02 11:04:43

1

您可以在方法上测试[ExpectedException]属性的例外情况。例如

[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(); 
} 
+0

Is ExpectedException异常断言的过时方法? 我认为这已被Assert.Throws <>或使用Constraint语法取代? – 2010-07-02 11:33:50

+0

也许,这只是我一直这样做的方式。 – 2010-07-02 11:55:59

+0

我想最终应该是哪个方法最好保持可读性和与测试的一致性。 我想这可能会被认为是由于较少的代码行,您建议的方式更好。它的确是可读性和易于理解的! – 2010-07-02 12:08:03