2016-04-29 10 views
2

モカを使ったタイムアウトのためにテストに失敗しました。 私は "done()"関数を呼び出しますが、それは何らかの理由で動作しないようです。ネストされた約束 - モカ - 超過タイムアウト

私のテストは、現在、次のようになります。

calendar.Connect()calendar.getAll()の両方が約束されている
var express = require('express'); 
var expect = require('chai').expect; 
var mocha = require('mocha'); 
var calendar = require('./../Server/calendarDatabase'); 

describe("Calendar", function() { 
    describe("Database", function() { 
     it("should get stuff from the database", function (done) { 
      return calendar.Connect() 
      .then(function() { 
       return calendar.getAll(); 
      }) 
      .then(function (returnValue) { 
       expect(returnValue.count).to.equal(5); //This should fail, my database records are 20+ 
       done(); 
      }); 
     }); 
    }); 
}); 

:私のテストを実行しながら、しかし

var express = require('express'); 
var sql = require('mssql'); 

var config = require('./../config'); 
var calendarDbConnection = {}; 

calendarDbConnection.Connect = function() { 
    return sql.connect(config.mssql);  
} 

calendarDbConnection.getAll = function() { 
    var promise = new sql.Request() 
     .query('select * from CalendarTable') 
     .catch(function (err) { 
      console.log(err.message); 
     }); 
    return promise; 
} 

module.exports = calendarDbConnection; 

、私は出力を以下の取得:

enter image description here

最後にthen()の後にdone()を呼び出すと、関数は解決されますが、テストの結果は返されません。私がデータベースから取得する行の数は20以上で、5と等しいかどうかをチェックします。したがって、テストは失敗するはずですが、そうではありません。

//previous code 
.then(function (returnValue) { 
    expect(returnValue.count).to.equal(5); //This should fail, my database records are 20+ 
    }); 
    done(); 
//... 

この最終的な結果は、私のテストに合格しますが、そうではありません。

私はここで何が欠けていますか?私はコールバック関数を呼び出すが、私の期待される結果は正しくない。

+0

エラーはスローされません。チェーンの最後に '.catch'を追加しますか? – CodingIntrigue

+0

私の質問が更新されましたが、これは動作しますが、その場合はテストに合格します。私は '期待'は、このテストが必要なキャッチブロックなしで失敗すると思った。 – Tikkes

+0

見つけた!私が自分の「done」をキャッチすれば、それは私が期待したアサーションで動作します。すなわち、「then(....){... done(); } .catch(done); '助けてくれてありがとう、私が受け入れる答えとしてこれを投稿してください。 – Tikkes

答えて

3

あなたはテストからの約束を戻ってきているので、引数としてあなたshould notパスdone

代わりに、代わりに行って()コールバックを使用して、あなたは約束を返すことがあります。これは、テストしているAPIがコールバックを取る代わりに約束を返す場合に便利です。

前述したように、あなたがdonecatchへの呼び出しを渡すことができますが、doneを取り除くだけの約束を返す取得する方が便利そうです。

it("should get stuff from the database", function() { 
    return calendar.Connect() // returns Promise, so no `done` 
    .then(function() { 
     return calendar.getAll(); 
    }) 
    .then(function (returnValue) { 
     expect(returnValue.count).to.equal(5); 
    }); 
}); 
0

キャッチでのみ実行されます。

then(....) { ... done(); }.catch(done); 
+0

受け入れられた答えが示唆していることを行うのがずっと簡単です:約束を返すだけです。 – Louis

関連する問題