2013-04-28 84 views
1

我用express写了一个简单的JSON API,我试图用摩卡做一些黑盒测试。通过测试API需要以不同的用户身份进行身份验证,因此每个针对特定功能的测试都至少包含两个请求:登录操作以及测试实际功能的一个或多个已验证请求。用于测试Express应用程序的状态交互

我还没有找到任何类似于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

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

async.serial会正好满足您的需求,但我会特别推荐async.auto,它允许您以清晰的方式将各种步骤与其依赖关系链接在一起。

+0

以前版本帖子中有一些内容“这看起来很像async.series,这不是巧合”。我应该把它留在那里:-)很显然,node.js并不缺少任何构建块,而是来自一个更庞大的整体框架,我觉得发现和学习10个模块非常繁琐,只是为了做一些如此简单的事情。我最终自己写了一个非常特定于Zappa的实现,我会在某处发布它。 – BruceBerry 2013-04-29 22:05:18

+0

节点生态系统就像Perl一样:有多种方式可以实现它。您花费大量时间评估潜在的模块选项。 – dankohn 2013-04-30 01:05:08

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); 
    }); 
0

我结束了自己写一个小图书馆,这是非常接近我的“理想”的例子在问题。它不值得自己的包了,所以我只是把它放在一个要点:

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

我无法得到的SuperAgent和supertest执行状态的互动,所以我就抛弃他们赞成的请求。主要的区别似乎是你不能链接期望,你必须在回调中做所有的测试,但是如果你已经在使用另一个测试库,例如should.js