如何使用Fluent Assertions在不等式测试中测试异常?

55

我正在尝试使用C#中的Fluent Assertions编写一个大于号重载运算符的单元测试。该类中的大于号运算符应在任一对象为空时抛出异常。

通常情况下,使用Fluent Assertions时,我会使用lambda表达式将方法放入一个action中。然后运行该action并使用action.ShouldThrow<Exception>。但是,我无法想象如何将运算符放入lambda表达式中。

为了保持一致性,我宁愿不使用NUnit的Assert.Throws()Throws约束或[ExpectedException]属性。


1
请参见 https://fluentassertions.com/documentation/#exceptions。 - Michael Freidgeim
2
那个链接已经失效了。现在它已更改为https://fluentassertions.com/exceptions/,但Kote的回答应该正确引导后来者。 - Steve Pettifer
3个回答

89

你可以尝试这种方法。

[Test]
public void GreaterThan_NullAsRhs_ThrowsException()
{
    var lhs = new ClassWithOverriddenOperator();
    var rhs = (ClassWithOverriddenOperator) null;

    Action comparison = () => { var res = lhs > rhs; };

    comparison.Should().Throw<Exception>();
}

看起来不够整洁,但它有效。

或者用两行表示

Func<bool> compare = () => lhs > rhs;
Action act = () => compare();

2
act.Should().NotThrow(); 用于检查是否没有异常。 - dani herrera
我在我的问题上稍微使用了不同的方法,因为我正在测试异步方法。因此,对于async/await,您可以将Action替换为Func<Task>。 - Spyros_Spy

0

你也可以使用调用

 comparison.Invoking(()=> {var res = lhs > rhs;})
.Should().Throw<Exception>();

更多信息在这里


0
我认为正确的写法应该是这样的:
var value1 = ...;
var value2 = ...;

value1.Invoking(x => x > value2)
.Should().ThrowExactly<MyException>()
.WithMessage(MyException.DefaultMessage);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接