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

标签 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'; 而不是 test.name = 'test 2';

最佳答案

区别在于,在情况 1 中,每次调用 beforeEach 时都会创建一个新对象,而在情况 2 中则不然。

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

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

关于javascript - 使用不同的 beforeEach 多次运行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55223579/

相关文章:

javascript - 从 ng 包含的 HTML 访问父 Controller

unit-testing - 对 databricks 笔记本上定义的函数进行单元测试以及对 pyspark DF 进行单元测试

java - Spock:我怎样才能得到失败测试的上下文?

angularjs - 如何在 Jasmine 测试中触发window.onbeforeunload

javascript - Jasmine + karma : 'expect' was used when there was no current spec error, 但为什么呢?

javascript - 将 HTML 文本输入光标符号更改为 "block"

javascript - Mootools 和 Win8 Store 应用程序开发

javascript - 默认情况下将 Ooyala 视频设置为 HTML 5

java - Mockito.invokeMethod : Can I pass an implemenation of a functional interface as an argument?

angular - 如何使用 Angular 6 在 Jasmine 中对 ngrx 功能选择器进行单元测试?