用于测试Express Apps的状态交互

时间:2013-04-28 03:31:15

标签: node.js testing express mocha supertest

我用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的胖箭,它根本不是一个坏习惯。

3 个答案:

答案 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,那些看起来很奇怪