Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在Arrange Act Assert测试样式中,可以将Act移动到Beforeach/设置块中吗?_Unit Testing_Jasmine_Arrange Act Assert - Fatal编程技术网

Unit testing 在Arrange Act Assert测试样式中,可以将Act移动到Beforeach/设置块中吗?

Unit testing 在Arrange Act Assert测试样式中,可以将Act移动到Beforeach/设置块中吗?,unit-testing,jasmine,arrange-act-assert,Unit Testing,Jasmine,Arrange Act Assert,当对单个逻辑操作的结果和/或副作用进行单元测试时,如何保持代码干燥?以以下用Jasmine编写的示例为例: describe("frobnicate", function () { var foo; beforeEach(function () { foo = getFoo(); }); it("causes side-effect 1", function () { frobnicate(foo); expect(sideEffect1).toEq

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

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. */
});
请注意对
frobnite(foo)
调用的重复操作。有了一个允许嵌套描述上下文(如Jasmine)的单元测试框架,按照以下思路重构测试似乎很自然:

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测试风格相矛盾?以这种方式重构代码会引发其他问题吗?

这不仅与排列Act Assert并不矛盾,而且我会坚持你以这种方式进行重构。测试中的重复是主要维护问题之一,应尽可能多地进行删除


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

不,这不好。是的,将行为放入设置步骤确实会带来问题,或者表明您可能已经走上了一条有问题的道路

人们通常希望这样做,因为他们相信每个测试只允许一个断言。他们发现测试给定的Arrange和Act组合需要不止一个断言,所以他们为每个断言编写一个测试。现在,Arrange-Act组合被复制,因此他们将其移动到设置步骤中。但现在他们有了新的问题:

  • 以这种方式编写的测试通常需要大量语法来说明通过将所有断言放在同一个测试中可以更简单地表达的内容

  • 如果Arrange和/或Act需要任何时间来运行,那么现在会有许多缓慢的测试,而不仅仅是一个

  • 我使用过的所有测试框架都将它们的设置步骤称为“之前”、“设置”,等等,毫无疑问,因为它们的作者正在考虑将这些步骤用于安排,而不是Act。如果您试图编写可读性良好的测试,那么这种自相矛盾的语言是不和谐的

因此,我通常为每个不同的排列动作对编写一个测试,并在该测试中使用所需的断言