2016-04-05 16 views
10

mongoとのデータのやりとりを検証するために、jestとmongooseを使って単体テストを書きたいと思います。jestユニットテストからmongoに接続しようとしたときのタイムアウト

mongo文書の作成/変更/処理の方法を具体的に検証したいので、ここでmongooseを模倣したくありません。

package.jsonがunmockedノードモジュールを残すように構成されています。私の実際の試験で

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

を、私はモンゴに接続するの世話をするためにbeforeAll()フックを設定している:

​​

ここでは出力があります:

/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 

毎回のテストタイムアウトは原因done()beforeAll()フックで呼び出されることはありません。エラーはスローされず、コンソールには何も出力されません。 beforeAll()フックにブレークポイントを配置して、コードが実行されていることを確認できます。 Mongooseとの接続を開こうとしている間にMongooseがぶら下がっているようで、Jestテストがタイムアウトしているようです。

jest環境の外で同様のコードを実行しているとき、期待通りに接続します(即座に近くにあります)。それが問題を引き起こす可能性があると疑い、私はjestのautomock機能を完全に無効にすることを実験しましたが、動作は変更されません。

私は何か信じられないほど明白なものを見逃してしまったと想像しています...何が起こっている可能性がありますか? 。。

  • 冗談-CLI V 0.10.0
  • マングースのV 4.4.11

更新:

  • は、プレーンfunction(done) {}でES6矢印関数の構文を交換しようとしました。変わりはない。
  • doneパラメータを渡してテストを非同期化し、テスト完了時に呼び出すよう試みました。変わりはない。
  • beforeAll()フックが正常に動作していることを確認するために、すべてのマングース関連のコードをコメントアウトしようとしましたerrorconnectedイベントハンドラ
  • の宣言の後mongoose.connect()を呼び出してみました - それはあります。
+1

ビットがありますが、代わりにES6の矢印構文の(行われる)機能を使用してみたのですか?微妙な違いがあります。 –

+1

あなたは以下を試すことができますか? 'それ( 'いくつかの性質を持っている'、(行って)=> { は//を渡す必要がありますが、実際に を実行することは決してありません(1).toBe(1)を期待する。 済(); });' –

+0

おかげ - 両方の提案を無駄にしようとすると、私の説明に追加されます。 – jayp

答えて

2

冗談-ジャスミンはJasmineは異なっています。
実際に使用した構文は、Jasmine 2.0以降であり、Jest-jasmineではありません。だからあなたが冗談を使い続けるには、答えを見つけるために冗談の文書を調べなければなりません。
さらに、 "beforeAll"は標準的なjest注入変数ではありません。jest apiを参照してください。

あなたのコードはJasmine 2.3.4で実行されていますが、正常に動作します。私はこの仕事を終わらせるために冗談でプロミス/ピットを試みたが失敗した。

まず、install jasmine。 ;あなたのコードに

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

./spec: 
mongodbspec.js support/ 

./spec/support: 
jasmine.json 

はその後、編集仕様/ mongodbspec.jsが、私はちょうど " '厳格な使用'" 1行を追加します。

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

は、ここに私のディレクトリ構造です。

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

最後に、実行「ジャスミン」:ロングショットの

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


1 spec, 0 failures 
Finished in 0.023 seconds 
+0

それを調べてくれてありがとう - それは私のコードisn '明らかに壊れていない!私を許しても、あなたはここで別の質問に答えています:)。私はJestがJasmineとは違う風味を使用していることを知っています。それらのフックは技術的に文書化されていません(しかし、彼らは働きます)。私はJestのビルトインオートロックとカバレッジなどを利用したい。 – jayp

+0

申し訳ありませんがあなたの問題は解決しませんでした。たぶんあなたはその構文をサポートするためにJestをハックすることができますが、私が試したように、それはおそらく複雑です。 –

関連する問題