我试图在编写单元测试时遵循排列-动作-断言模式,但我对哪种方法更好感到困惑。我使用的是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);我的第二种方法是:
int key = 1;
string value = "X";
board.Add(key, value);
Assert.Throws<ArgumentException>(() => board.Add(key, value));哪种方法更好?
编辑:在wp.me/p4f69l-3z上写了关于这个的博客
发布于 2014-06-06 05:26:24
您的第一个.Add调用实际上应该是arrange的一部分。把它当作行动的前提条件/设置。除此之外,您还可以将act包装在Action中,以使其更易于阅读:
//Arrange
int key = 1;
string value = "X";
board.Add(key, value);
//Act
Action addingSameKeySecondTime = () => board.Add(key, value);
//Assert
Assert.Throws<ArgumentException>(addingSameKeySecondTime)注释中提到的FluentAssertions库使得这样的断言更加类似于句子
int key = 1;
string value = "X";
board.Add(key, value);
Action addingSameKeySecondTime = () => board.Add(key, value);
addingSameKeySecondTime.ShouldThrow<ArgumentException>();发布于 2018-03-22 01:49:56
对我来说,源代码应该是自描述的,所以AAA注释更像是变通方法,可能不会提供足够的灵活性。查看这个库:Heleonix.Testing你可以像在JavaScript中一样,以给定/何时/然后和AAA的形式编写测试。
发布于 2014-06-06 05:00:44
我会说你的第二个例子更好。Assert.Throws将通过/失败测试,因此没有理由获得结果并对此进行断言。当我写“将抛出”测试时,我把它放在一行或两行上:
[Test]
public void SomeMethod_NullSomething_ShouldThrow() {
var something = MakeTarget();
Assert.Throws<ArgumentNullException>(() => something.SomeMethod(null));
}https://stackoverflow.com/questions/24070115
复制相似问题