提供されている単体テストによって設定された仕様を満たすことを試みたとき、私が遭遇したメソッドのステータスコードを返そうとしたとき
TypeError:res.statusは関数ではありません
aPI実装で関数createUserを実行するとき。これは、res.send、res.sendStatusなどのすべてのメソッド呼び出しで発生します。res.status()をテストに追加してそこに設定しても、同じエラーが返されます。
apiTests.js
let chai = require('chai');
let expect = chai.expect;
let sinon = require('sinon');
let sinonChai = require('sinon-chai');
chai.use(sinonChai);
let model = require('../tron_model.js'); // for stubbing only
let api = require('../tron_api.js');
describe('API', function() {
describe('creating users', function() {
it('should return 201 on creating user', function () {
let mockModel = sinon.stub(new model.TronModel());
mockModel.addUser.onFirstCall().returns(new model.User('user','pass'));
let req = {body: {username: 'goatzilla', password: 'x'}};
let res = {end: function(){}};
api.init(mockModel);
api.createUser(req, res);
expect(res.statusCode).to.equal(201);
expect(mockModel.addUser).to.have.callCount(1);
});
});
});
tron_api.js
let model = undefined;
let api = exports;
api.init = function(modelArg) {
model = modelArg;
};
api.createUser = function(req, res) {
model.addUser(req.body.username, req.body.password);
console.log(res);
res.status(201);
};
次のコードでres
オブジェクトをモック化しました。
_let res = {end: function(){}};
_
これには.status()
メソッドがなく、それをapi.createUser()
関数(モックされたオブジェクトにないメソッド)の呼び出しを想定しているres.status()
関数に渡しました。モックされたオブジェクトには、コードが呼び出すすべてのメソッドが必要です。
さらに、プロパティ_res.statusCode
_も次のようにテストします。
_expect(res.statusCode).to.equal(201);
_
これもモックされたオブジェクトには存在しません。 res.status()
はExpressの組み込み機能ですが、_res.statusCode
_はドキュメント化されたプロパティではありません(存在するように見えます)。
次のように、モックしたres
オブジェクトに追加できます。
_let res = {
end: function(){}
status: function(s) {this.statusCode = s; return this;}
};
_
これらの2つのテストに合格するため。