首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在期望出现异常时应用Arrange-Act-Assert模式的最佳方法

在期望出现异常时应用Arrange-Act-Assert模式的最佳方法
EN

Stack Overflow用户
提问于 2014-06-06 04:55:55
回答 5查看 3.6K关注 0票数 4

我试图在编写单元测试时遵循排列-动作-断言模式,但我对哪种方法更好感到困惑。我使用的是xUnit,我解决这个问题的第一种方法是:

代码语言:javascript
复制
//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);

我的第二种方法是:

代码语言:javascript
复制
int key = 1;
string value = "X";

board.Add(key, value);

Assert.Throws<ArgumentException>(() => board.Add(key, value));

哪种方法更好?

编辑:在wp.me/p4f69l-3z上写了关于这个的博客

EN

回答 5

Stack Overflow用户

发布于 2014-06-06 05:26:24

您的第一个.Add调用实际上应该是arrange的一部分。把它当作行动的前提条件/设置。除此之外,您还可以将act包装在Action中,以使其更易于阅读:

代码语言:javascript
复制
//Arrange
int key = 1;
string value = "X";
board.Add(key, value);

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

//Assert
Assert.Throws<ArgumentException>(addingSameKeySecondTime)

注释中提到的FluentAssertions库使得这样的断言更加类似于句子

代码语言:javascript
复制
int key = 1;
string value = "X";
board.Add(key, value);

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

addingSameKeySecondTime.ShouldThrow<ArgumentException>();
票数 5
EN

Stack Overflow用户

发布于 2018-03-22 01:49:56

对我来说,源代码应该是自描述的,所以AAA注释更像是变通方法,可能不会提供足够的灵活性。查看这个库:Heleonix.Testing你可以像在JavaScript中一样,以给定/何时/然后和AAA的形式编写测试。

票数 1
EN

Stack Overflow用户

发布于 2014-06-06 05:00:44

我会说你的第二个例子更好。Assert.Throws将通过/失败测试,因此没有理由获得结果并对此进行断言。当我写“将抛出”测试时,我把它放在一行或两行上:

代码语言:javascript
复制
[Test]
public void SomeMethod_NullSomething_ShouldThrow() {
    var something = MakeTarget();

    Assert.Throws<ArgumentNullException>(() => something.SomeMethod(null));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24070115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档