如何测试REST API +客户端MVC应用程序?

时间:2014-01-11 15:15:34

标签: javascript node.js testing mocha

当你有一个RESTful服务器只通过从数据库中获取一些信息来响应JSON,然后你有一个客户端应用程序,如Backbone,Ember或Angular,你从哪一方面测试一个应用程序? / p>

我是否需要进行两项测试 - 一组用于后端测试,另一组用于前端测试?

我问的原因是测试REST API本身就很困难。考虑这个代码示例(使用Mocha,Supertest,Express):

var request = require('supertest');
var should = require('chai').should();
var app  = require('../app');

describe('GET /api/v1/people/:id', function() {
  it('should respond with a single person instance', function(done) {
    request(app)
      .get('/api/v1/people/:id')
      .expect(200)
      .end(function(err, res) {
        var json = res.body;
        json.should.have.property('name');
        done();
      });
  });
});

请注意网址中的:id?这是特定人的ObjectId。我怎么知道该通过什么?此时我甚至没有查看数据库。这是否意味着我需要导入Person模型,连接到数据库并在测试中进行查询?也许我应该将我的整个app.js移动到测试中? (讽刺:P)。这是很多耦合。单独依赖mongoose意味着我需要在本地运行MongoDB才能运行此测试。我查看了sinon.js,但我不确定它是否适用于此处。关于如何短饲猫鼬的例子并不多。

我很好奇人们如何测试这些类型的应用程序?

2 个答案:

答案 0 :(得分:1)

您是否尝试在服务器端测试中使用mongoose-model-stub?它将使您不必记住或硬编码测试数据库信息。

至于测试客户端,你的“webapp”基本上是两个应用程序:服务器API和客户端前端。你想要理想的测试。您已经知道如何测试服务器了。在客户端上,您将使用存根的“响应”(基本上是假的json字符串,看起来像您的Web服务吐出的内容)来测试您的方法。这些不一定是实时网址;相反,它可能是最好的,如果它们只是你可以根据需要编辑的静态文件。

答案 1 :(得分:1)

我会使用nock .. https://github.com/pgte/nock

您要测试的是您为路线编写的代码。 所以你要做的是,创建一个响应点,在终点被击中时发送。

基本上它是假的服务器.. 像这样......

您的实际方法..

request({
      method: "GET",
      url: "http://sampleserver.com/account"
    }, function(err, res, data){
      if (err) {
        done(err);
      } else {
        return done(null,data);
      }
    });  

然后..

var nockObj = nock("http://sampleserver.com")
                        .get("/account")
                        .reply(200,mockData.arrayOfObjects);
  //your assertions here..

这样你就不会改变你的代码的功能..就像说..而不是点击实时服务器..这个假的服务器,并获取模拟数据。您所要做的就是确保模拟数据与预期数据保持同步..