当你有一个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,但我不确定它是否适用于此处。关于如何短饲猫鼬的例子并不多。
我很好奇人们如何测试这些类型的应用程序?
答案 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..
这样你就不会改变你的代码的功能..就像说..而不是点击实时服务器..这个假的服务器,并获取模拟数据。您所要做的就是确保模拟数据与预期数据保持同步..