如何testingREST API +客户端MVC应用程序?

如果你有一个RESTful服务器,它只通过从数据库获取一些信息来响应JSON,然后你有一个客户端应用程序,比如Backbone,Ember或者Angular,你从哪一边testing一个应用程序?

我是否需要两个testing – 一个用于后端testing,另一个用于前端testing?

我问的原因是testingREST 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在URL中的:id ? 这是一个特定人物的ObjectId。 我怎么知道要通过那里? 在这一点上,我甚至没有看过数据库。 我的意思是我需要导入Person模型,连接到数据库,并从testing内部做查询? 也许我应该把我的整个app.js移动到testing中? (讽刺:P)。 这是很多的耦合。 单独依赖mongoose意味着我需要让MongoDB在本地运行才能运行这个testing。 我看着sinon.js,但我不确定这里是否适用。 关于如何剔除mongoose的例子并不多。

我只是好奇,人们如何testing这些types的应用程序?

你有没有尝试在你的服务器端testing中使用mongoose模型存根 ? 它将使您不必记住或硬编码您的testing数据库信息。

至于testing客户端,你的“webapp”基本上是两个应用程序:一个服务器API和一个客户端前端。 你想要两个理想的testing。 你已经知道如何testing你的服务器了。 在客户端上,您可以使用从您的API中删除“响应”(基本上假的JSONstring,看起来像您的Web服务吐出)testing您的方法。 这些不一定是活的url; 相反,如果他们只是静态文件,可以根据需要进行编辑。

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

你想testing的是你为你的路线写的代码。 所以你要做的是创build一个响应,当终点被击中时发送。

基本上它是一个假的服务器..这样的事情..

你的实际方法..

 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.. 

这样你就不会改变你的代码的function..它就像说…而不是击中现场服务器..这个假的服务器,并得到模拟数据。 你所要做的就是确保你的模拟数据与预期的数据同步。