4

2013 年 7 月 2 日更新

ラップされた匿名関数で最後のアプローチを使用すると、奇妙なテスト動作が発生する可能性があります。スローされたエラーが予想されるが、実際の実行にエラーがある場合、テストはパスしますが、おそらく予期していたものではないエラーを渡します。私が指定しているエラーの場合、スタブから返されたエラー テキストとスローされたエラーが同じであることを確認します。エラーを必ずしも知らないサードパーティのライブラリからのものである場合は、パスがテストしているユニットに固有のものであることを知るために、任意の値を入力します。sinon.js を使用してシズルをスタブする例。

    it('should return an error if the save fails', function(){
        stubCall.restore();
        stubCall = sinon.stub(Provider, 'save').callsArgWith(1, new Error('Save Error'));

        (function(){
            User.create(fakeUser, function(err, user){
               if(err)
                throw err;
            });
        }).should.throw("Save Error");
    });

私はNode.jsに取り掛かり、Mochaとshould.js(およびある時点でsinonも)を使用して、動作駆動開発(BDD)を実行しようとしています。

私が問題を抱えていることの1つは、コールバックによって返されたエラーのテストです。たとえば、次の簡単なテストです。

it('should return an error if you try and execute an invalid Query object', function () {
        var stubQuery = {}; 

        Provider.execute(stubQuery, function (err) {
            //should.not.exist(err);
            should.have.property('message', 'Invalid Query Object');
        });
    });

関数で:

PostgresqlProvider.prototype.execute = function (query, cb) {

};

何を試してテストしても問題ありません。テストは常に成功します(should.existなど)。最初に失敗させる唯一の方法は、 cb(null); を追加することです。これは、テストに失敗する動作を追加するのではなく、動作を追加する前にテストしようとしているときに、私がやっていることに逆行します。

おそらくいくつかのレベルで、ここでいくつかの本当の初心者の間違いを犯していることは知っていますが、コールバックがスローされないために渡されたエラーのテストを把握していません(これは、より簡単にテストできると確信しています)!

アップデート

ハーマンのコードを使用して、私は実際にその言葉を調整しました(動作が定義されていないため、テストは失敗しています)

        it('should return an error if you try and execute an invalid Query object', function () {
        var stubQuery = {};
        Provider.execute(stubQuery, function (err) {
            if (err) throw new Error(err);
        }).should.throw();
    });

今の問題は、テストに合格するためにコールバックで送信された場合、エラーを「キャッチ」できないことです。should.throwメソッドは呼び出されません。私のメソッドからのコールバックへのエラー。これはスコープに依存する可能性がありますが、何らかの形の閉鎖を追加する必要があるかどうか、およびどのレベルで追加する必要があるかはわかりません。

更新 2

それを理解すると、関数への呼び出しをコールバック (Doh!) ではなくクロージャー内にラップし、クロージャーの最後にアサート (should.throw) を配置する必要がありました。

        it('should return an error if you try and execute an invalid Query object', function () {
        var stubQuery = {};
        (function(){
            Provider.execute(stubQuery, function (err) {     
                if (err) 
                    throw err;
            });
         }).should.throw();
    });
4

1 に答える 1

0

テストを失敗させるには、テスト関数内で例外を生成する必要があります。

私はif (err) throw "Invalid query error " + errこのように追加します:

it('should return an error if you try and execute an invalid Query object', function () {
    var stubQuery = {}; 

    Provider.execute(stubQuery, function (err) {
        if (err) throw "Invalid query error " + err
    });
});

それはすべきです。

(更新時)

should.throw()私にとってもうまくいきませんでした...フローを機能させるためにこの汚いハックを行いました:

it('should return an error if you try and execute an invalid Query object', function () {
  var stubQuery = {}; 

  try {
    Provider.execute(stubQuery, function (err) {
      if (err) throw "Invalid query error " + err
    });
    // No error, keep on the flow
    noError ();
  } catch (e) {
    // Error, let's continue the flow there
    error (e)
  }

  function noError () {
    // The flow in the event we have no error
    // ... //
  }

  function error (errorObj) {
    // The flow, in the event we have error
    // ... //
  }

});

お役に立てれば!

于 2012-10-25T13:58:59.570 に答える