当单元测试单个逻辑操作的结果和/或副作用时,如何使代码保持干燥?以用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. */
});请注意对frobnicate(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测试风格有什么矛盾吗?以这种方式重构代码会引起其他问题吗?
发布于 2014-12-22 15:52:08
这不仅是不矛盾的安排-行动-断言,而且我会坚持你做这样做。重复测试是主要的维护问题之一,应该尽可能多地删除。
关于复制的最大问题是“如果这种情况发生变化会发生什么?”,如果您必须在多个地方更改它,重构。
发布于 2015-08-08 15:22:43
不,这是不好的。是的,把法案放在一个设置步骤中确实会引起问题,或者暗示你可能已经走上了一条有问题的道路。
人们通常希望这样做,因为他们认为每个测试只允许一个断言。他们发现测试一个给定的排列和动作组合需要多个断言,所以他们为每个断言编写了一个测试。现在排列-动作组合是重复的,所以他们把它移动到一个设置步骤.但现在他们有了新的问题:
因此,我通常为每个不同的排列-动作对编写一个测试,并在该测试中使用我需要的尽可能多的断言。
https://stackoverflow.com/questions/27605764
复制相似问题