2014-09-20 101 views
0

以下工作agent.auth描述块

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')行。我应该把认证代码放在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

为了记录,这是我做了什么来解决这个问题。我修改了supertest的代理对象和请求原型。 现在有一个叫做权威性导致Request.end调用AUTH结束前,第一种方法,然后恢复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(); 
     }); 
    }); 
    }); 

}); 

我的测试运行这样的,所以配置脚本首先被执行:

mocha tests/configure.js tests/*-test.js