我用express写了一个简单的JSON api,我试图用mocha做一些黑盒测试。通过测试API需要作为不同用户进行身份验证,因此针对特定功能的每个测试至少由两个请求组成:登录操作和一个或多个经过身份验证的请求,用于测试实际功能。
我没有找到任何类似于django.test.client
的库来模拟HTTP客户端和服务器之间的状态交互。 Supertest似乎很受欢迎,但与django测试客户端相比,它是非常低级的。这就是我用它来编写一个简单的认证测试的原因(原谅我的coffeescript):
it 'should return a 200 OK', (done) ->
supertest(server.app)
.post('/login')
.send("username=xxx&password=pass")
.end (err, res) ->
res.should.have.status(200)
supertest(server.app)
.get('/api/users')
.set('cookie', res.headers['set-cookie'][0])
.expect(200, done)
这真的是执行互动最干净的方式吗?是否有任何图书馆可以帮助我解决异步问题(在99%的情况下,我不需要除了测试的简单序列化,回调只是令人困惑)和状态?有点像这样:
it 'should rock', (done) -> myCoolLibrary [
->
@post '/login', {username: "xxx", password: "pass"}, (err, res) =>
res.should.have.status 200
@done()
,
->
@get '/api/users', (err, res) =>
res.should.have.status 200
@done()
]
如果没有类似的东西,我应该自己写:-) 对环境的依赖是因为我现在使用太多的ZappaJS,并且由于CoffeeScript的胖箭,它根本不是一个坏习惯。
答案 0 :(得分:1)
听起来你可以从zombiejs中受益。它模拟浏览器并在请求之间保留cookie和会话数据。
它还为您提供了更强大的功能,例如允许您填写表单并提交表单。
典型的测试看起来像这样:
var Browser = require('zombie')
, browser = new Browser({site:'http://yoursite.com'});
describe('page',function(){
before(function(done){
browser.visit('/loginpage',done);
});
it('should return a 200 page',function(done){
browser.fill('username','xxx');
browser.fill('password','pass');
//assuming your form points to /login
browser.pressButton('button[type="submit"]'),function(){
assert(browser.success); //status code is 2xx
}).then(done,done); //call the done handler after promise is fulfilled
});
it('should rock',function(done){
browser.visit('/api/users',function(){
assert(browser.success);
}).then(done,done);
});
答案 1 :(得分:0)
作为使异步代码更清晰的更通用的解决方案,请查看异步。 https://github.com/caolan/async
async.serial可以满足您的需求,但我特别推荐使用async.auto,它允许您以明确的方式将各种步骤与其依赖项链接在一起。
答案 2 :(得分:0)
我最后给自己写了一个小型图书馆,这个图书馆在我的问题中非常接近我的“理想”例子。它现在不值得拥有它自己的包,所以我只是把它放在一个要点:
https://gist.github.com/BruceBerry/5485917
我无法让超级和超级的人进行有状态的互动,所以我只是抛弃它们而不是请求。主要区别似乎是你不能链接期望而你必须在回调中进行所有测试,但是如果你已经在使用另一个测试库,例如should.js,那些看起来很奇怪