当没有当前规范时使用'expect',这可能是因为异步测试在Jasmine 2.3.1中超时

时间:2015-12-26 06:36:07

标签: angularjs jasmine gulp karma-runner

我正在通过gulp运行业力测试案例如下:

gulp.task('unit-test-karma', function () {
    return gulp.src(filePaths.libraryPaths.concat(filePaths.codePathsVerbose.concat(filePaths.testPaths).concat(filePaths.htmlPaths).concat(filePaths.jadePaths)))
        //.pipe(plumber({ errorHandler: notify.onError(function(error) { console.log(error.message); return "Karma Error"; }) }))
        .pipe(karma({
            configFile: './karma.conf.js',
            action: 'run', // watch
            singleRun: true,
            reporters: [ 'dots' ]
        }));
});

当我以run的操作运行时,IE 11会抛出错误。

IE 11.0.0 (Windows 10 0.0.0) ERROR
  'expect' was used when there was no current spec, this could be because an asynchronous test timed out
  at C:/BbCAT-WebDI/BbCAT-Web/BbCAT-Angular/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:938

但是,如果与watch的操作一样运行,那么所有测试用例都会在chrome,IE和firefox中成功执行。

阅读一些帖子后,看来$ http服务电话有问题,但无法找到问题的确切位置!

5 个答案:

答案 0 :(得分:2)

这是一个非常现实的问题,我目前也在遇到这个问题。我认为这里有一个核心错误。我有很好的封装测试。它们很小(每个最多3行)

我有一个带有2个嵌套描述的主要描述部分 首先描述有8个it()函数 第二个有3个()函数。

describe("main", ()=>{
    describe("1st", ()=>{
        //here are 8 it() definitions
    })
    describe("2nd", ()=>{
        //here are 3 it() definitions
    })
})

现在,当我从任一描述中删除单个it()定义时,问题就会消失。或者,如果我添加第3个describe(),问题就会消失。

这是茉莉花中的一个问题 - 要么他们没有正确报告错误,要么有可怕的错误。或者,可能是因为同时运行多个测试而试图变得智能的业力。无论哪种方式,这个问题都是真实的,它与凌乱的代码无关。

也许它与被测试的基础单元有关 - 我的函数是递归的(虽然我的测试用例不会深入研究)。

karma-jasmine@0.3.8

jasmine-core@2.4.1

karma@0.13.22

phantomjs-prebuilt@2.1.7

karma-phantomjs-launcher@1.0.0

答案 1 :(得分:1)

您是否可以嵌套一些应该分开的测试,或者在同一测试用例中解析多个异步调用?

我产生了同样的错误,但这是我自己做的。我在其中一个()中有两个异步测试。一旦任何一个承诺得到解决,测试就结束了。另一个承诺决议是孤立的。

考虑这些片段。假设被测函数在被调用时响应正确。

注意:为了更清楚地说明问题,我省略了then()的错误路径。

这种结构失败了。当任何一个promises返回并且done()被触发时,第二个现在失败了"'期望'当没有当前的规格时使用......"错误。

describe( "delay", function(){
    var calculator = new Calculator();

    it( "delays execution - add and subtract", function(done){
        delay( 1000, calculator, 'add', [ 10, 5 ] )
            .then(function(result){
                expect(result).toEqual( 15 );
                done();  // <---- as soon as this runs, test is over
            });

        delay( 500, calculator, 'subtract', [ 9, 5 ] )
            .then(function(result){
                expect(result).toEqual( 4 );
                done(); // <---- as soon as this runs, test is over
            });
    });

} );

这是编写测试的正确方法。每个承诺都封装在自己的测试中。

describe( "delay", function(){
    var calculator = new Calculator();

    it( "delays execution - add", function(done){
        delay( 1000, calculator, 'add', [ 10, 5 ] )
            .then(function(result){
                expect(result).toEqual( 15 );
                done(); // <--- this is now the only resolution for  this test
            });
    });

    it( "delays execution - subtract", function(done){
        delay( 500, calculator, 'subtract', [ 9, 5 ] )
            .then(function(result){
                expect(result).toEqual( 4 );
                done(); // <--- this is now the only resolution for  this test
            });
    });

} );

由于我还没有足够的声誉来发表评论,我在此提出请求。 : - )

如果这是你的问题,你能否将这个答案标记为正确?

答案 2 :(得分:1)

这里有同样的问题,结果是我用setTimeout进行了测试。清除了所有这一切!

答案 3 :(得分:0)

在Jasmine 3.5中也出现了此错误消息-它使我感到不应该,因为它在谈论异步并且我在项目中有其他人提供的jquery。

这只是设置测试的语法问题……我的原始照片

it("should ...")
  expect(thing).toBe(whatever);
})

与工作相对……

it("should ...", function(){
  expect(thing).toBe(whatever);
})

答案 4 :(得分:0)

我遇到了此错误,但这是因为我有一个describe函数而内部没有it函数。

不正确

describe('helpDocsDirective', function () {   
    expect(true).toBe(true);
});

正确

describe('helpDocsDirective', function () {
    it("should return true", function () {
        expect(true).toBe(true);
    });
});