2016-05-06 4 views
0

私は約束を使用するmongooseオブジェクトを単体テストしようとしています。私は下のテストを書いて、それは動作しますが、それは完全ではありません。私は 'then'や 'catch'メソッドが呼び出されたかどうかをテストする方法を理解できません。単位テストmongooseはsinonで約束します

私は約束を解決するときに「then」メソッドが呼び出されることをスパイで確認するにはどうすればよいですか?正しい方向に私を助けるため@ReedD

export function create(req, res) { 
    User 
    .createAsync(req.body) 
    .then(handleCreate(res, req.originalUrl)) 
    .catch(handleError(res)); 
} 

ユニットテスト

it('should do something',() => { 
    const req = { 
    body: 45, 
    }; 

    const res = {}; 

    const mockRole = sandbox.mock(Role).expects('createAsync').once().withArgs(45) 
    .returns(Promise.resolve()); 

    controller.create(req, res); 
}); 

私が使用した溶液WITH UPDATE(5月6日、2016年)

感謝をテストするための

方法

これは「機能する」とはいえ、私のコードよりも約束事の機能性をテストしているようなウナギ。

it('should call create with args and resolve the promise',() => { 
    const createSpy = sinon.spy(); 
    const errorSpy = sinon.spy(); 

    sandbox.stub(responses, 'responseForCreate').returns(createSpy); 
    sandbox.stub(responses, 'handleError').returns(errorSpy); 

    sandbox.mock(Role).expects('createAsync').once().withArgs(45) 
    .returns(Promise.resolve()); 

    return controller.create(req, res).then(() => { 
    expect(createSpy.calledOnce).to.be.equal(true); 
    expect(errorSpy.calledOnce).to.be.equal(false); 
    }); 
}); 

答えて

1

あなたはmodule.exportshandleCreatehandleErrorを追加し、それらのスタブやspysを作ることができます。以下は私があなたがやろうとしていることの例です。私はあなたがsinon/chaiを使っているとも仮定しました。

http://ricostacruz.com/cheatsheets/sinon-chai.html

// controller.js 

module.exports = { 
    handleCreate: function() { 
     // ..code 
    }, 
    handleError: function() { 
     // ..code 
    }, 
    create: function (req, res) { 
     User 
      .createAsync(req.body) 
      .then(this.handleCreate(res, req.originalUrl)) 
      .catch(this.handleError(res)); 
    } 
}; 



// test/test.js 

var controller = require('../controller'); 

it('should do something', function (done) { 

    var handleCreate = sandbox.spy(controller, 'handleCreate'); 
    var handleError = sandbox.spy(controller, 'handleError'); 
    var mockRole  = sandbox 
     .mock(Role) 
     .expects('createAsync') 
     .once().withArgs(45) 
     .returns(Promise.resolve()); 


    var req = { 
     body: 45, 
    }; 

    var res = { 
     send: function() { 
      expect(handleCreate).to.be.calledOnce; 
      expect(handleError).to.not.be.called; 
      done(); 
     } 
    }; 

    controller.create(req, res); 
}); 
+0

感謝。これは、私が使用し終わった解決策のための正しい道に私を得ました。結局のところ私はPromisesの機能を単体テストしているような気がします:D – VtoCorleone

+0

本当に、このユニットテストはあなたの 'create'関数が正しく動作していることを保証します。 'handleCreate'と' handleError'も正しく動作するように、単体テストをもっと書くべきです。 – ReedD

関連する問題