ログイン後に自分のAPIを使用できます。例えば、/api/sales
は以下のコードのような認証が必要です。Mochaサーバが提供する認証されたAPIのテスト
app.all('/api/*', userController.requiresLogin);
app.route('/api/sales')
.get(common.readAll(Sale, 'name'))
.post(common.create(Sale));
(私はNode.jsのとExpress.jsを使用しています)userController.requiresLogin
機能は次のとおりです。
exports.requiresLogin = function(req, res, next) {
console.log('Check login...');
if(!req.user) return res.status(401).send();
else next();
};
ログインするには、私はpassport.js
を使用しています。
exports.login = passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: false
});
サーバーを実行してこのAPIをブラウザでテストすると、正常に動作します。
このAPIを自動的にテストするために、私はSupertestを使用して自分のMochaテストコードを作成しました。
var request = require('supertest'),
should = require('should'),
utils = require('./../utils'),
mongoose = require('mongoose');
var Sale = mongoose.model('Sale'),
User = mongoose.model('User');
var user;
describe('Controller Testing:', function() {
describe('Sale Controller Testing:', function() {
var agent = request.agent();
beforeEach(function(done) {
user = new User({
username:'[email protected]',
password: 1234,
userId: 'default user'
});
user.save();
request(app).post('/login')
.send({username: '[email protected]', password: '1234'})
.end(function(err, res) {
should.not.exist(err);
agent.saveCookies(res);
done();
});
});
afterEach(function() {
User.remove({}, function(){});
Sale.remove({}, function(){});
}
it('create a sale', function(done) {
var sale = {
name: 'New Sale',
orders: [order1]
};
var req = request(app).post('/api/sales')
.send(sale)
.expect('Content-Type', /json/)
.expect(200);
agent.attachCookies(req);
req.end(function(err, res) {
console.log(res.statusCode);
res.body.name.should.equal('New Sale');
done();
});
});
}
このテストでは、を失敗し続けています。 「販売を作成する」というテストでは、対応するCookieを保存しても、ユーザーがログインしたことを識別することはできません。
あなたの改訂版が動作します!ありがとう!問題は、私の元のコードが同じ 'agent'を使うのではなく、別々の' request(app) 'を作っているようです。 – byron1st