5

我们编写了一个 RESTful Web API,它使用 node.js 响应 GET 和 PUT 请求。我们在测试 API 时遇到了一些困难。首先,我们使用了 Zombie.js,但它没有很好的文档记录,所以我们无法让它发出 PUT 请求:

var zombie = require("zombie");

describe("description", function() {
  it("description", function() {
    zombie.visit("http://localhost:3000/", function (err, browser, status) {
      expect(browser.text).toEqual("A")
    });
  });
});

之后我们尝试使用名为restler的 REST 客户端,这没问题,因为我们不需要任何高级浏览器模拟。由于请求似乎是异步的,因此失败 - 即测试是无用的,因为它在调用“成功”回调之前完成:

var rest = require('restler');
describe("description", function() {
  it("description", function() {
    rest.get("http://www.google.com").on('complete', function(data, response) {
      // Should fail
      expect(data).toMatch(/apa/i);
    });
  });
});

我们将感谢有关替代测试框架或同步请求客户端的任何提示。

4

2 回答 2

4

对于节点,来自 Misko Hevery 的 jasmine-node 具有异步支持并包装了 jasmine。

https://github.com/mhevery/jasmine-node

您将“完成”参数添加到测试签名,并在异步调用完成时调用它。您还可以自定义超时时间(默认为 500 毫秒)。

例如来自 Github README

it("should respond with hello world", function(done) {
  request("http://localhost:3000/hello", function(error, response, body){
    done();
  }, 250);  // timeout after 250 ms
});

jasmine regular 还支持带有运行和 waitsFor 的异步测试,或者可以将“done”与 Jasmine.Async 一起使用。

于 2013-08-13T12:27:48.433 回答
3

我对此很好奇,所以我做了更多的研究。除了僵尸,你有几个选择......

您可以像 this guy 一样将vows与 http 库一起使用。

但是,我认为更好的方法可能是使用 APIeasy,它显然是基于 vows 构建。nodejitsu 上有一篇很棒的文章解释了如何使用它

另一个有趣的想法是在使用 express时使用expresso 。

于 2011-10-19T18:21:45.133 回答