所以我的测试中有这两种情况。第一个工作正常,在第二个中,我尝试在外部提取 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';
而不是 test.name = 'test 2';
最佳答案
区别在于,在情况 1 中,每次调用 beforeEach 时都会创建一个新对象,而在情况 2 中则不然。
与此相结合的是,您的第一个测试会改变对象。如果所有测试都引用同一对象(即情况 2),则该突变将影响第一个测试后运行的任何代码。相反,如果在每次测试之前都覆盖该对象(情况 1),则该突变不会影响其他测试。
有几种方法可以解决这个问题。一是只保留case 1;通过每次重置为已知状态,您可以为所有测试提供一个干净的状态。另一种选择是不改变对象。也许测试可以复制该对象,然后修改该副本。
关于javascript - 使用不同的 beforeEach 多次运行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55223579/