#jasmine #jasmine-node #strongloop #loopbackjs
#jasmine #jasmine-узел #strongloop #loopbackjs
Вопрос:
Я пытаюсь написать unittests для циклической модели с использованием jasmine. Моя модель имеет обычные конечные точки CRUD, но я определил пользовательскую конечную точку ‘/ products/: id / upload’, которая ожидает форму с файлами.
Моя модель выглядит так
'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?
Ответ №1:
Было предложено использовать supertest в качестве 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.
});
});
});
Комментарии:
1. Есть ли приспособления, чтобы я мог сгенерировать гостя вместо необходимости регистрироваться?
2. Я не уверен, что нужно зарегистрировать. Не могли бы вы уточнить?
3. Например, регистрация пользователя и вход в систему для получения токена аутентификации. В таких ситуациях было бы удобно иметь приспособления вместо того, чтобы каждый раз делать серию запросов.
4.
app
разве переменная не должна быть объявлена внеbeforeEach
функции, чтобы она была доступна для супертестирования внутриit
. Кроме того, я продолжаю получать 404 вместо 200, используя этот тест. Есть идеи, почему?5. не могли бы вы, пожалуйста, дополнить ответ контекстом исходного вопроса? В этом ответе нет никаких признаков включения модели, которую OP хотел протестировать.