所以我的测试中有这两种情况。第一个工作正常,在第二个中,我尝试将外部的beforeEach声明提取出来,但失败了,但我不明白为什么。这是一个简单的情况,基本上我尝试定义一个数组并对其进行循环,以便使用不同的beforeEach参数声明多次运行测试。
案例1
var params;
describe('When initializing', function () {
beforeEach(function () {
params = {
name: 'test 1'
};
});
it('should ..', function () {
params.name = 'test 2';
expect(...); => success
});
it('should ..', function () {
expect(...); => success because it expects params.name to be 'test 1' and it is 'test 1'
});
});
案例2
var params;
var test = {
name: 'test 1'
};
describe('When initializing', function () {
beforeEach(function () {
params = test;
});
it('should ..', function () {
params.name = 'test 2';
expect(...); => success
});
it('should ..', function () {
expect(...); => fails because it expects params.name to be 'test 1' and it is 'test 2'
});
});
在第二个测试中,如果我在描述内console.log(test.name)
,我将得到test 2
,尽管先前的it
只是params.name = 'test 2';
而不是{{ 1}}
答案 0 :(得分:1)
区别在于,在情况1中,您每次调用Each之前都会创建一个新对象,而在情况2中则不是。
与之相结合的是,您的第一个测试会使该对象变异。如果所有测试都指向同一个对象(即情况2),则该突变将影响在第一个测试之后运行的任何代码。相反,如果对象在每次测试之前都被覆盖(情况1),则该突变不会影响其他测试。
有一些解决方法。一种是只保留案例1;另一种是保留案例1。通过每次都重置为已知状态,可以使所有测试都处于干净状态。另一种选择是不使对象变异。也许测试可以复制对象,然后修改该副本。