使用不同的beforeEach多次运行测试

时间:2019-03-18 14:23:30

标签: javascript unit-testing jasmine karma-runner

所以我的测试中有这两种情况。第一个工作正常,在第二个中,我尝试将外部的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}}

1 个答案:

答案 0 :(得分:1)

区别在于,在情况1中,您每次调用Each之前都会创建一个新对象,而在情况2中则不是。

与之相结合的是,您的第一个测试会使该对象变异。如果所有测试都指向同一个对象(即情况2),则该突变将影响在第一个测试之后运行的任何代码。相反,如果对象在每次测试之前都被覆盖(情况1),则该突变不会影响其他测试。

有一些解决方法。一种是只保留案例1;另一种是保留案例1。通过每次都重置为已知状态,可以使所有测试都处于干净状态。另一种选择是不使对象变异。也许测试可以复制对象,然后修改该副本。