web-dev-qa-db-ja.com

ステータスコードを設定しようとすると、res.statusが関数にならない

提供されている単体テストによって設定された仕様を満たすことを試みたとき、私が遭遇したメソッドのステータスコードを返そうとしたとき

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);
};
5
David Wood

次のコードで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つのテストに合格するため。

7
jfriend00