首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在“排列-动作-断言”测试样式中,是否可以将“行为”移动到“前”/“设置”块中?

在“排列-动作-断言”测试样式中,是否可以将“行为”移动到“前”/“设置”块中?
EN

Stack Overflow用户
提问于 2014-12-22 15:38:02
回答 2查看 1.1K关注 0票数 3

当单元测试单个逻辑操作的结果和/或副作用时,如何使代码保持干燥?以用Jasmine编写的以下示例为例:

代码语言:javascript
复制
describe("frobnicate", function () {
  var foo;

  beforeEach(function () {
    foo = getFoo();
  });

  it("causes side-effect 1", function () {
    frobnicate(foo);

    expect(sideEffect1).toEqual('you did it');
  });

  it("causes side-effect 2", function () {
    frobnicate(foo);

    expect(sideEffect2).toHaveBeenCalled();
  });

  /* side effect 3, 4, etc. */
});

请注意对frobnicate(foo)的调用的重复行为。使用允许嵌套描述上下文的单元测试框架(如Jasmine),按照以下方式重构测试似乎是非常自然的:

代码语言:javascript
复制
describe("frobnicate", function () {
  beforeEach(function () {
    var foo = getFoo();

    frobnicate(foo);
  });

  it("causes side-effect 1", function () {
    expect(sideEffect1).toEqual('you did it');
  });

  it("causes side-effect 2", function () {
    expect(sideEffect2).toHaveBeenCalled();
  });

  /* test side effect 3, 4, etc. */
});

这种风格与AAA测试风格有什么矛盾吗?以这种方式重构代码会引起其他问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-22 15:52:08

这不仅是不矛盾的安排-行动-断言,而且我会坚持你做这样做。重复测试是主要的维护问题之一,应该尽可能多地删除。

关于复制的最大问题是“如果这种情况发生变化会发生什么?”,如果您必须在多个地方更改它,重构。

票数 2
EN

Stack Overflow用户

发布于 2015-08-08 15:22:43

不,这是不好的。是的,把法案放在一个设置步骤中确实会引起问题,或者暗示你可能已经走上了一条有问题的道路。

人们通常希望这样做,因为他们认为每个测试只允许一个断言。他们发现测试一个给定的排列和动作组合需要多个断言,所以他们为每个断言编写了一个测试。现在排列-动作组合是重复的,所以他们把它移动到一个设置步骤.但现在他们有了新的问题:

  • 以这种方式编写的测试通常需要大量语法来表示,如果将所有断言都放在同一个测试中,那么本来可以说的更简单。
  • 如果安排和/或行动需要任何时间来运行,现在有许多缓慢的测试,而不仅仅是一个。
  • 我使用过的所有测试框架都将其设置步骤称为“以前”、" setup“等,这无疑是因为他们的作者正在考虑使用这些步骤来安排,而不是用于行动。如果你想写一些阅读能力很好的测试,这种矛盾的语言是令人不快的。

因此,我通常为每个不同的排列-动作对编写一个测试,并在该测试中使用我需要的尽可能多的断言。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27605764

复制
相关文章

相似问题

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