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的博客
你的第一个.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)
我想说你的第二个例子更好。Assert.Throws 将通过/失败测试,因此没有理由获取其结果并对其进行断言。当我编写“将抛出”测试时,我将其保留在一两行:
[Test]
public void SomeMethod_NullSomething_ShouldThrow() {
var something = MakeTarget();
Assert.Throws<ArgumentNullException>(() => something.SomeMethod(null));
}
Run Code Online (Sandbox Code Playgroud)