web-dev-qa-db-ja.com

現在の仕様がないときに 'expect'が使用されました。これは、Jasmine 2.3.1で非同期テストがタイムアウトしたことが原因である可能性があります

以下のように、カルプテストケースを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サービスの呼び出しに問題があるようですが、問題がどこにあるのかを正確に見つけることができません!

21
Jay Shukla

これは非常に現実的な問題です。私も現在経験しています。ここにコアバグがあると思います。私は非常によくカプセル化されたテストを持っています。小さい(最大3行ずつ)

2つのネストされた記述を持つメイン記述セクションがあります。最初の記述には8つのit()関数があり、2番目には3it()関数があります。

つまり

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

どちらかの記述から単一のit()定義を削除すると、問題が消えます。または、3番目のdescribe()を追加すると、問題が解決します。

これはジャスミンの問題です-彼らがエラーを正しく報告していないか、ひどく何かが間違っています。あるいは、複数のテストを同時に実行して賢くしようとするカルマかもしれません。どちらにせよ、この問題は現実のものであり、乱雑なコードとは関係ありません。

多分それはテストされている基礎となるユニットに関係しているでしょう-私の機能は再帰的です(私のテストケースは深く潜っていませんが)。

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

2
Tjad Clark

ここでも同じ問題がありましたが、setTimeoutを使用してテストしたことがわかりました。それをクリアし、すべて良い!

1
stefan

分離する必要があるいくつかのテストをネストしたり、同じテストケースで複数の非同期呼び出しを解決したりできますか?

私はこれと同じエラーを生成しましたが、それは私自身が行いました。 1つのit()内に2つの非同期テストがありました。どちらかの約束が解決するとすぐに、テストは終了しました。他の約束の解決は孤立しました。

これらのスニペットを検討してください。テスト対象の関数が呼び出されたときに正しく応答するとします。

注:問題をより明確に説明するために、then()からのエラーパスを省略しています。

この構築は失敗します。 promiseのいずれかが返され、done()が実行されると、2番目のプロミスが失敗し、「現在の仕様がないときに 'expect'が使用されました...」エラーが発生します。

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
            });
    });

} );

これは、テストを記述する正しい方法です。各promiseは独自のテストにカプセル化されています。

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
            });
    });

} );

コメントするほどの評判がまだないので、ここに申し立てをします。 :-)

これがあなたの問題であることが判明した場合、この回答を正しいものとしてマークできますか?

1
Curt Eckhart

ジャスミン3.5にもこのエラーメッセージがありました-非同期について話していたので、他の誰かからのプロジェクトにjqueryがあったため、必要以上に私を投げました。

テストを設定する際の構文上の問題でした...私のオリジナル

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

対作業...

it("should ...", function(){
  expect(thing).toBe(whatever);
})
0
Mirv - Matt

このエラーが発生しましたが、describe関数が内部にないit関数があったためです。

不正解

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

正しい

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