以下有效:
describe('My App', function() {
describe('when logged in', function() {
it('should allow registered user to make a thing', function(done) {
agent.post('/make-a-thing')
.auth('testusername', 'validuserpass')
.send({thingName:'mythingname'})
.expect(201)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('thingUrl').and.to.match(/thing\/[0-9a-f]+$/);
done();
});
});
});
});
现在,如果我想在“登录时”块中添加越来越多的测试,我不想每次都重复.auth('testusername', 'validuserpass')
行。我应该将auth代码放在beforeEach中,因为这就是beforeEach的用途。
所以我尝试了这个:
describe("My App", function() {
describe('when logged out', function() {
it('should disallow anonymous user from doing things', function(done) {
agent.post('/do-things')
.send({thingName:'mythingname'})
.expect(403)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
});
describe('when invalid user', function() {
beforeEach(function(done) {
agent.auth('invalidusername', 'invaliduserpass');
done();
});
it('should disallow unrecognized user from doing things', function(done) {
agent.post('/do-things')
.send({thingName:'mythingname'})
.expect(403)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
})
describe('when logged in', function() {
beforeEach(function(done) {
agent.auth('testusername', 'validuserpass');
done();
});
it('should allow registered user to make a thing', function(done) {
agent.post('/make-a-thing')
.send({thingName:'mythingname'})
.expect(201)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('thingUrl').and.to.match(/thing\/[0-9a-f]+$/);
done();
});
});
it('should require name attribute to create a thing', function(done) {
agent.post('/make-a-thing')
.send({notaname:'notathingname'})
.expect(409)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
});
});
agent.auth
未定义的情况。我认为auth
方法是在auth.post
。
有办法做到这一点吗?
答案 0 :(得分:0)
为了记录,这是我为解决这个问题所做的。我修改了supertest的代理对象和 Request 原型。 代理现在有一个名为 auth 的方法,它会导致 Request.end 在结束之前先调用 auth ,然后恢复< em> Request.end 回到原来的状态。
configure.js
var app = require('app'),
supertest = require('supertest');
// global
agent = supertest.agent(app);
(function(Request) {
'use strict';
(function(_end) {
agent.auth = function() {
var authArgs = arguments;
Request.end = function() {
var endArgs = arguments;
var endResult = _end.apply(this.auth.apply(this, authArgs), endArgs);
Request.end = _end;
return endResult;
};
return agent;
};
})(Request.end);
})(agent.post('').constructor.prototype);
APP-test.js
describe("My App", function() {
describe('when logged out', function() {
it('should disallow anonymous user from doing things', function(done) {
agent.post('/do-things')
.send({thingName:'mythingname'})
.expect(403)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
});
describe('when invalid user', function() {
beforeEach(function(done) {
agent.auth('invalidusername', 'invaliduserpass');
done();
});
it('should disallow unrecognized user from doing things', function(done) {
agent.post('/do-things')
.send({thingName:'mythingname'})
.expect(403)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
})
describe('when logged in', function() {
beforeEach(function(done) {
agent.auth('testusername', 'validuserpass');
done();
});
it('should allow registered user to make a thing', function(done) {
agent.post('/make-a-thing')
.send({thingName:'mythingname'})
.expect(201)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('thingUrl').and.to.match(/thing\/[0-9a-f]+$/);
done();
});
});
it('should require name attribute to create a thing', function(done) {
agent.post('/make-a-thing')
.send({notaname:'notathingname'})
.expect(409)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
});
});
我的测试是这样运行的,所以首先执行 configure 脚本:
mocha tests/configure.js tests/*-test.js