【问题标题】:Run tests multiple times with different beforeEach使用不同的 beforeEach 多次运行测试
【发布时间】:2019-03-18 14:23:30
【问题描述】:

所以我的测试中有这两个案例。第一个工作正常,在第二个中,我尝试在外面提取 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';,它也会以某种方式被覆盖

【问题讨论】:

    标签: javascript unit-testing jasmine karma-runner


    【解决方案1】:

    不同之处在于,在情况 1 中,您每次调用 beforeEach 时都会创建一个新对象,而在情况 2 中则不是。

    再加上你的第一个测试改变了对象的事实。如果所有测试都指向同一个对象(即案例 2),那么该突变将影响在第一次测试之后运行的任何代码。相反,如果在每次测试之前都覆盖了对象(案例 1),那么突变不会影响其他测试。

    有几个选项可以解决这个问题。一是只保留案例1;通过每次重置为已知状态,您可以获得一个干净的状态,以便所有测试都可以进行。另一种选择是不改变对象。也许测试可以复制对象,然后修改该副本。

    【讨论】:

    • 嗨。这没有任何意义。第一个测试正是第二个测试,唯一的事情是在第二个测试中,对象被提取到外面。测试变量在任何时候都不会发生变异,并且在 beforeEach 内部使用了一个。我的第二个测试不是创建新对象是什么意思,因为它是相同的测试,它也有 beforeEach,所以它应该创建对象吗?我的问题是为什么第二个测试不起作用,因为我需要那样使用它。
    • The first test is exactly the second test with the only thing that in the second one, the object is extracted outside. 这样做的结果是您只创建了一次 params/test 对象(在描述之前),然后重复引用同一个对象。在案例 1 中,您在每次测试之前创建一个全新的对象。 The test variable is not mutated at any point 突变发生在这一行:params.name = 'test 2';
    • 以防万一,params = test; 复制对象或创建新对象。它只是对同一个现有对象进行了另一个引用。
    • 这不是测试变量,而是在第一次测试中也发生了变异的 params 变量。
    • 它们是一样的。你只有两个对同一个对象的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2013-06-13
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2016-07-20
    相关资源
    最近更新 更多