Jasmine strongloop loopback.io模型的单元测试远程方法
我正在尝试使用jasmine为环回模型编写单元测试。我的模型有常用的CRUD端点,但我定义了一个自定义的“/products/:id/upload”端点,它需要一个包含文件的表单 我的模型看起来像Jasmine strongloop loopback.io模型的单元测试远程方法,jasmine,jasmine-node,strongloop,loopbackjs,Jasmine,Jasmine Node,Strongloop,Loopbackjs,我正在尝试使用jasmine为环回模型编写单元测试。我的模型有常用的CRUD端点,但我定义了一个自定义的“/products/:id/upload”端点,它需要一个包含文件的表单 我的模型看起来像 'use strict'; var loopback = require('loopback'); var ProductSchema = { location: { type: String, required: true }, vers
'use strict';
var loopback = require('loopback');
var ProductSchema = {
location: {
type: String,
required: true
},
version: {
type: String,
required: true
},
id: { type: Number, id: 1, generated: true }
};
var opts = {
strict: true
};
var dataSource = loopback.createDataSource({
connector: loopback.Memory
});
var Product = dataSource.createModel('Product', ProductSchema, opts);
Product.beforeRemote('upload', function(ctx){
var uploader = function(req, res){
// parse a multipart form
res({
result:'success'
});
};
function createProduct(uploaderResult){
// create a product out of the uploaded file
ctx.res.send({
result: uploaderResult.result
});
}
uploader.upload(ctx.req, createProduct);
});
Product.upload = function () {
// empty function - all the logic takes place inside before remote
};
loopback.remoteMethod(
Product.upload,
{
accepts : [{arg: 'uploadedFiles', http: function(ctx){
return function() {
return { files : ctx.req.body.uploadedFiles, context : ctx };
};
}},
{arg: 'id', type: 'string'}],
returns : {arg: 'upload_result', type: String},
http: {path:'/:id/upload', verb: 'post'}
}
);
module.exports = Product;
我的最终目标是测试“createProduct”的逻辑。
我的测试看起来像
'use strict';
describe('Product Model', function(){
var app = require('../../app');
var loopback = require('loopback');
var ProductModel;
beforeEach(function(){
app = loopback();
app.boot(__dirname+'/../../'); // contains a 'models' folder
ProductModel = loopback.getModel('Product');
var dataSource = loopback.createDataSource({
connector: loopback.Memory
});
ProductModel.attachTo(dataSource);
});
it('should load file ', function(){
console.log(ProductModel.beforeRemote.toString());
console.log(ProductModel);
ProductModel.upload();
});
});
通过调用ProductModel.upload();我希望触发before远程钩子,它将运行createProduct。我可以单独测试“createProduct”,但是我会忽略这样一个事实,即createProduct最终会作为上传的结果被调用
非常清楚的是,核心问题是:
如何在unittests中使用远程方法挂钩?建议将其用作http服务器。下面是一个代码片段,说明了如何在jasmine中实现这一点
describe('My product suite', function(){
var request = require('supertest');
var app;
beforeEach(function(){
app = loopback();
// don't forget to add REST to the app
app.use(app.rest());
});
it('should load file', function() {
request(app).post('/products/id-of-existing-product/upload')
.attach('file', 'path/to/local/file/to/upload.png')
.expect(200)
.end(function(err, res) {
if (err) return done(err);
// res is the HTTP response
// you can assert on res.body, etc.
});
});
});
是否有固定装置,这样我就可以生成一个来宾而不必注册?我不确定需要注册什么。您能澄清一下吗?例如,注册一个用户,并登录以获取身份验证令牌。在这些情况下使用fixture会很方便,而不是每次都发出一系列请求。是否应该在每个函数之前在
之外声明app
变量,以便在It
内部进行supertest。而且,我通过这个测试得到的是404而不是200。你知道为什么吗?你能用原问题的上下文来推测答案吗?在这个答案中没有迹象表明包括OP想要测试的模型。