在对单个逻辑操作的结果和/或副作用进行单元测试时,如何保持代码 DRY?以 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. */
});
请注意重复的 Act 以及对 的调用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 测试风格有任何矛盾吗?以这种方式重构代码会引发其他问题吗?