期待异常时应用Arrange-Act-Assert模式的最佳方法

pmb*_*ugo 4 c# unit-testing xunit.net arrange-act-assert

我正在尝试在编写单元测试时遵循Arrange-Act-Assert模式,我到了一个地方,我很困惑哪种方法会更好.我正在使用xUnit,我的第一个问题是:

//Arrange
int key = 1;
string value = "X";

//Act
board.Add(key, value);
var result = Assert.Throws<ArgumentException>(() => board.Add(key, value));

//Assert
Assert.IsType<ArgumentException>(result);
Run Code Online (Sandbox Code Playgroud)

我的第二种方法是:

int key = 1;
string value = "X";

board.Add(key, value);

Assert.Throws<ArgumentException>(() => board.Add(key, value));
Run Code Online (Sandbox Code Playgroud)

哪种方法更好?

编辑:关于wp.me/p4f69l-3z的博客

k.m*_*k.m 5

你的第一个.Add电话应该是安排的一部分.将其视为行为的前提条件/设置.除此之外,你可以包装行动,Action使其更好地阅读:

//Arrange
int key = 1;
string value = "X";
board.Add(key, value);

//Act
Action addingSameKeySecondTime = () => board.Add(key, value);

//Assert
Assert.Throws<ArgumentException>(addingSameKeySecondTime)
Run Code Online (Sandbox Code Playgroud)

评论中提到的FluentAssertions库使得这样的断言更加类似于句子:

int key = 1;
string value = "X";
board.Add(key, value);

Action addingSameKeySecondTime = () => board.Add(key, value);

addingSameKeySecondTime.ShouldThrow<ArgumentException>();
Run Code Online (Sandbox Code Playgroud)


Nei*_*ith 0

我想说你的第二个例子更好。Assert.Throws 将通过/失败测试,​​因此没有理由获取其结果并对其进行断言。当我编写“将抛出”测试时,我将其保留在一两行:

[Test]
public void SomeMethod_NullSomething_ShouldThrow() {
    var something = MakeTarget();

    Assert.Throws<ArgumentNullException>(() => something.SomeMethod(null));
}
Run Code Online (Sandbox Code Playgroud)