2016-04-05 23 views
10

Chcę napisać kilka testów jednostkowych z żartem i mangustą, aby potwierdzić interakcję danych z mongo.Limit czasu przy próbie połączenia z mongo z testów jednostkowych

Nie chcę drwić z mangusty, ponieważ chcę walidować sposób, w jaki dokumenty mongo zostały utworzone/zmodyfikowane/przetworzone.

package.json jest skonfigurowany tak, aby pozostawić modułów węzła unmocked:

{ 
    "jest": { 
    "unmockedModulePathPatterns": [ 
     "node_modules" 
    ] 
    } 
} 

W moim teście, mam założyć beforeAll() hak, aby zadbać o podłączenie do Mongo:

const mongoose = require('mongoose'); 

describe('MyTest',() => { 

    beforeAll((done) => { 
    mongoose.connect('mongodb://127.0.0.1:27017/test'); 

    let db = mongoose.connection; 

    db.on('error', (err) => { 
     done.fail(err); 
    }); 

    db.once('open',() => { 
     done(); 
    }); 
    }); 

    it('has some property',() => { 
    // should pass but actually never gets run 
    expect(1).toBe(1); 
    }); 
}); 

Oto wyjście :

/usr/local/bin/node node_modules/jest-cli/bin/jest.js --verbose 
Using Jest CLI v0.10.0, jasmine2 
FAIL src/lib/controllers/my-controller/__tests__/my-test.js (5.403s) 
MyTest 
    ✕ it has some property 

MyTest › it has some property 
    - Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 
     at Timer.listOnTimeout (timers.js:92:15) 
1 test failed, 0 tests passed (1 total in 1 test suite, run time 5.903s) 

Process finished with exit code 1 

Czas testu za każdym razem ponieważ done() nigdy nie jest wywoływany w hakcie beforeAll() - nie są zgłaszane żadne błędy ani nic nie jest drukowane na konsoli. Umieszczę punkty przerwania w haku beforeAll() w celu sprawdzenia, czy kod jest uruchamiany. Wygląda na to, że mangusta wisi podczas próby otwarcia połączenia z Mongo, a potem kończy się limit czasu.

Gdy uruchamiam podobny kod poza środowiskiem żartu, łączy się on zgodnie z oczekiwaniami (prawie natychmiast). Podejrzewając, że może to być przyczyną problemów, eksperymentowałem z wyłączaniem funkcji automockiego żartu, ale zachowanie pozostaje niezmienione.

Wyobrażam sobie, że przegapiłem coś niesamowicie oczywistego ... jakiekolwiek pomysły, co może się dziać? ,.

  • JEST-cli V 0.10.0
  • gambianus V 4.4.11

Aktualizacje:

  • Próbowano zastępując ES6 składni funkcji strzałka zwykły function(done) {}. Bez różnicy.
  • Próbowałem dokonać testu asynchronicznego, przekazując parametr done i wywołując go przy zakończeniu testu. Bez różnicy.
  • Próbowaliśmy dzwonić mongoose.connect() po ogłoszeniu error i connected obsługi zdarzeń
  • próbowali zakomentowanie cały kod związany Mongoose, aby sprawdzić, czy hak beforeAll() działa poprawnie - to jest.
+1

Trochę długie ujęcie, ale spróbować użyć funkcji (zrobione) zamiast strzałki Składnia ES6? Istnieją pewne subtelne różnice. –

+1

możesz spróbować poniżej? to '('ma pewną właściwość', (zrobione) => { // powinien przejść, ale w rzeczywistości nigdy się nie uruchomić spodziewać (1) .toBe (1); done(); });' –

+0

Dzięki - wypróbowałem obie sugestie bez skutku, dodam do mojego opisu. – jayp

Odpowiedz

2

Jest-jaśmin różni się od Jasmine.
Użyta składnia w rzeczywistości należy do Jasmine 2.0+, a nie Jest-jaśmin. Więc jeśli chcesz nadal używać żartów, musisz zajrzeć do dokumentacji żartów, aby znaleźć odpowiedź.
Co więcej, "beforeAll" nie jest standardowym zmiennym wprowadzanym przez wirusy, zobacz jest api.

Mam kod uruchamiany z Jasmine 2.3.4, działa dobrze. Próbowałem obietnicy/dołu w żartach, aby ukończyć tę pracę, ale się nie powiodło.

Po pierwsze, install jasmine.

npm install -g jasmine 
mkdir jasmine-test 
cd jasmine-test 
jasmine init 
jasmine examples 
touch spec/mongodbspec.js 

Oto moja struktura katalogów:

fenqideMacBook-Pro:jasmine-test fenqi$ ls -R 
.: 
spec/ 

./spec: 
mongodbspec.js support/ 

./spec/support: 
jasmine.json 

Następnie edytuj Spec/mongodbspec.js, po prostu dodać jedną linię " 'use strict';" do kodu.

'use strict'; 

const mongoose = require('mongoose'); 

describe('MyTest',() => { 

    beforeAll((done) => { 
    mongoose.connect('mongodb://127.0.0.1:27017/test'); 

    let db = mongoose.connection; 

    db.on('error', (err) => { 
     done.fail(err); 
    }); 

    db.once('open',() => { 
     done(); 
    }); 
    }); 

    it('has some property',() => { 
    // should pass but actually never gets run 
    expect(1).toBe(1); 
    }); 
}); 

Ostatni, run 'jaśmin':

fenqideMacBook-Pro:jasmine-test fenqi$ jasmine 
Started 
. 


1 spec, 0 failures 
Finished in 0.023 seconds 
+0

Dzięki za spoglądanie w to - pomaga zrozumieć, że mój kod nie jest" t wyraźnie złamane! Wybacz mi, ale odpowiadasz na inne pytanie tutaj :). Mam świadomość, że Jest używa innego smaku jaśminu, a te haki są technicznie nieudokumentowane (ale działają). Chcę skorzystać z wbudowanego automocku Jest i pokrycia itp .. – jayp

+0

Niestety nie udało się rozwiązać problemu. Może możesz hakować, aby wspierać tę składnię, ale jak próbowałem, może to być skomplikowane. –

Powiązane problemy