1

我用 express 写了一个简单的 JSON api,我正在尝试使用 mocha 进行一些黑盒测试。全面测试 API 需要以不同用户身份进行身份验证,因此针对特定功能的每次测试至少由两个请求组成:登录操作和一个或多个测试实际功能的经过身份验证的请求。

我还没有找到任何类似于django.test.client模拟 HTTP 客户端和服务器之间的状态交互的库。Supertest似乎很流行,但与django测试客户端相比,它是非常低级的。这就是我用它编写一个简单的经过身份验证的测试的方式(请原谅我的咖啡脚本):

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

4

3 回答 3

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);
    });
于 2013-04-29T22:51:58.773 回答
0

我最终为自己编写了一个小型库,该库非常接近我在问题中的“理想”示例。它现在不值得拥有自己的包,所以我只是把它放在一个要点中:

https://gist.github.com/BruceBerry/5485917

我无法让 superagent 和 supertest 执行有状态交互,所以我放弃了它们,转而使用 request。主要区别似乎是您不能链接期望,并且您必须在回调中进行所有测试,但是如果您已经在使用另一个测试库(例如 should.js),这些看起来还是很奇怪

于 2013-04-30T00:52:29.587 回答
0

作为使异步代码更清晰易读的更通用解决方案,请查看 async。https://github.com/caolan/async

async.serial 可以满足您的需要,但我特别推荐 async.auto,它允许您以清晰的方式将各个步骤及其依赖项链接在一起。

于 2013-04-29T21:08:00.473 回答