【问题标题】:Jasmine Runs Test Three TimesJasmine 运行测试 3 次
【发布时间】:2016-06-13 03:51:21
【问题描述】:

我正在我的开发机器上运行 Karma/Jasmine/Angular 2.0 测试。就在最近,我的开发箱上的 Jasmine 决定开始运行我的测试 3 次。是的,每次正好 3 次。

在第一次运行时,一切都按预期进行。但是,在第二次和第三次通过时,所有相同的事情都失败了。它总是承认有 7 次测试,但运行 21 次,10 次失败(窗外一年级数学)????

这也是 fails on Travis 与 SauceLabs。 (注意:链接到旧版本,有 3 次测试,但运行 9 次,5 次失败???)

我有一个屏幕截图、karma.conf.js 文件和一个启动整个事情的套件。非常感谢任何帮助。


罪魁祸首 [TypeScript](删除这个并在我的开发盒上解决问题):

Full source

describe('From the Conductor Service', () => {
    let arr: Array<ComponentStatusModel> = null;
    let svc: ConductorService = null;
    
    beforeEach(() => {  
        arr = [/* Inits the array*/];
        svc = new ConductorService();
    });

    describe('when it is handed a container to hold objects which need to be loaded', () => {
        // More passing tests...
    
        /// vvvvv The culprit !!!!!
        describe('then when you need to access the container', () => {
            beforeEach(() => {
                svc.loadedContainer = arr;
            });
        
            it('it should always be available', () => {
                assertIsLocalDataInTheService(arr, svc.loadedContainer);
            });
        });
        /// ^^^^^ End of culprit !!!!!
    });

    // More passing tests...
});

失败的测试:

浏览器截图:

不确定这是否相关,但在所有错误发生之前,Jasmine 调用堆栈较小(左侧,观察滚动条)。错误开始后,堆栈会随着重复调用相同的函数而变大(右,观察滚动条)。

套件堆栈错误:

在我的测试中,Nanobar 和 Conductor 规格文件是完全分开的。但是,您可以看到套件阵列包含来自 Nanobar 和 Conductor 规范的内容。 Jasmine 不知何故将这两个规范文件混合在一起(在一切开始失败之后),并导致我的 describe() 语句在发布到控制台时没有任何意义。

简化的 karma.conf.js:

Full source

module.exports = function (config) {
    config.set({
        autoWatch: false,
        basePath: '.',
        browsers: ['Chrome'],
        colors: true,
        frameworks: ['jasmine'],
        logLevel: config.LOG_INFO,
        port: 9876,
        reporters: ['coverage', 'progress'],
        singleRun: true,
        
        coverageReporter: {
            // Code coverage config
        },

        files: [
            // Loads everything I need to work
        ],

        plugins: [
            'karma-chrome-launcher',
            'karma-coverage',
            'karma-jasmine'
        ],

        preprocessors: {
            'app/**/*.js': ['coverage']
        },

        proxies: {
            // Adjust the paths
        }
    })
}

【问题讨论】:

  • 您的样本并不能准确显示问题所在,但 99% 的情况下,当我遇到此类问题时,这是因为一项或多项测试具有“副作用”。基本上需要编写测试,以便beforeEach 部分从头开始构建所有内容。然后每个测试都可以独立运行并以任何顺序运行。如果您确实需要更改全局或其他类似变量,请使用 afterEach 再次将其删除。希望对您有所帮助!
  • @drew_w 非常感谢您的建议。如果为了清楚起见,我包含整个规范会更有帮助吗?
  • 老实说,您可能已经针对问题的核心发布了足够的详细信息。获得更准确答案的最佳选择是发布一个小提琴或类似的东西来证明这个问题。我知道这需要时间,但肯定会有所帮助。
  • @drew_w 我实际上在 GitHub 上有这个项目。如果有帮助,这里是规范:git.io/v2Kat(链接也在上面)
  • 我刚遇到同样的问题,注意到如果在测试中实例化新管道或在测试前在beforeEach 中实例化新管道,它似乎会消失(例如导入外部库并在每次测试之前实例化它)。

标签: javascript angular unit-testing jasmine karma-runner


【解决方案1】:

第一件事是这些测试随机运行。如果你在任何测试用例中传递一些数据,如果你认为你可以恢复它是不可能的。

您必须在每个测试用例之前声明数据,以便所有测试用例都获取数据。 所有测试用例独立运行。

如果您使用数组或对象,则必须在深度克隆后使用它,因为数组和对象在引用上起作用。如果你操作任何值,它也会改变原始数组。

在大多数情况下,如果测试失败,则您在测试用例中传递的数据可能存在错误。

【讨论】:

    【解决方案2】:

    您能否在每个测试文件的第一个断言中尝试刷新浏览器? 试试这个:

    browser.restart();
    

    我遇到了同样的问题,这为我解决了问题。

    【讨论】:

      【解决方案3】:

      我会尝试对此进行调试并查明确切原因。 通常在我正在测试的函数中有重定向代码或任何重新加载代码时发生。

      • 您可以尝试将 f 添加到 describe 和 it 的前缀(即 fdescribe 和 fit)

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 2014-09-02
        相关资源
        最近更新 更多