sinonでspy/stub/mock化したメソッドのアサーションはsinon.assertを使ったほうがいいと思う。
index.js
function getIndexPage(req, res) {
return res.render('index');
}
module.exports = getIndexPage
index.spec.js
it('renders index view', () => {
const req = {};
const res = {};
res.render = sinon.spy();
getIndexPage(req, res);
expect(res.render.calledOnce).to.be.true;
expect(res.render.calledWithExactly('indexx')).to.be.true; // chai.expect
sinon.assert.calledWithExactly(res.render, 'indexx'); // sinon.assert
});
chai.expectだと、trueを期待したのにfalseだった、という表示になる。
res.render.calledOnce
の検証に失敗したのか、res.render.calledWithExactly('indexx')
の検証に失敗したのかがわかりづらい。
AssertionError: expected false to be true
at Context.it (test/index.spec.js:9:57) // ここで失敗したテストコードの行番号がわかる
sinon.assertだと、失敗箇所がわかりやすく、実際にどんな引数で呼ばれたかがわかる(実際にはrender('index')
で呼ばれた)
expected render to be called with exact arguments indexx
render(index) at getIndexPage (controllers/index.js:2:14)
2017/02/24追記
sinon-chaiを使うと、sinon.assertをexpectで書ける。
これでexpectとsinon.assertが混在しなくなる。
chai.use(require('sinon-chai'));
...
sinon.assert.calledWithExactly(res.render, 'indexx'); // これを
expect(res.render).to.have.been.calledWithExactly('indexx'); // こうやって書ける