web-dev-qa-db-fra.com

'expect' a été utilisé en l'absence de spécification actuelle, cela peut être dû au fait qu'un test asynchrone a expiré dans Jasmine 2.3.1

J'exécute des cas de test de karma via gulp comme ci-dessous:

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

Lorsque je lance avec une action comme run, IE 11 jette l'erreur ci-dessous.

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

Mais si vous exécutez la même chose avec l'action que watch, alors tous les cas de test s'exécutent avec succès dans chrome, IE et firefox.

Après avoir lu un article, il semble qu'il y ait un problème avec l'appel de service $ http mais pas en mesure de trouver d'où vient exactement le problème!

21
Jay Shukla

C'est un problème très réel, je le vis aussi. Je pense qu'il y a un bug de base ici. J'ai des tests très bien encapsulés. ils sont petits (au plus 3 lignes chacun)

J'ai une section principale de description avec 2 descriptions imbriquées, la première décrit a 8 fonctions it (), la seconde a 3it () fonctions.

c'est à dire

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

Maintenant, lorsque je supprime une seule définition it () de l'une ou l'autre des descriptions, le problème disparaît. Alternativement, si j'ajoute un 3ème describe (), le problème disparaît.

C'est un problème dans le jasmin - soit ils ne signalent pas correctement une erreur, soit il y a quelque chose d'horriblement mal. Alternativement, il peut s'agir de karma essayant d'être intelligent en exécutant plusieurs tests simultanément. Quoi qu'il en soit, ce problème est réel et cela n'a rien à voir avec du code désordonné.

Cela a peut-être à voir avec l'unité sous-jacente testée - ma fonction est récursive (bien que mes cas de test ne plongent pas profondément).

[email protected]

[email protected]

[email protected]

[email protected]

[email protected]

2
Tjad Clark

Eu le même problème ici, il s'est avéré que j'ai eu un test avec setTimeout. Effacé cela et tout va bien!

1
stefan

Pourriez-vous avoir imbriqué quelques tests qui devraient être séparés, ou avoir plusieurs appels asynchrones résolus dans le même scénario de test?

J'ai produit cette même erreur, mais c'était de ma propre faute. J'ai eu deux tests asynchrones à l'intérieur d'un (). Dès que l'une des promesses a été résolue, le test a pris fin. L'autre résolution de promesse est devenue orpheline.

Considérez ces extraits. Supposons que la fonction testée répond correctement comme appelée.

Remarque: J'ai omis les chemins d'erreur de then () afin d'illustrer le problème plus clairement.

Cette construction échoue. Lorsque l'une des promesses revient et que done () est renvoyé, la seconde échoue maintenant avec l'erreur "'expect' a été utilisée alors qu'il n'y avait pas de spécification actuelle ...".

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

} );

C'est la bonne façon d'écrire les tests. Chaque promesse est encapsulée dans son propre test.

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

} );

Comme je n'ai pas encore assez de réputation pour commenter, je mets ici mon plaidoyer. :-)

Pourriez-vous marquer cette réponse comme correcte si cela s'avère être votre problème?

1
Curt Eckhart

Il y avait également ce message d'erreur dans Jasmine 3.5 - il m'a jeté plus qu'il n'aurait dû, car il parlait d'async et j'ai un projet jquery de quelqu'un d'autre.

C'était juste un problème de syntaxe dans la configuration du test ... mon original

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

Vers le travail ...

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

J'ai rencontré cette erreur, mais c'est parce que j'avais une fonction describe sans fonction it à l'intérieur.

Incorrect

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

Correct

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