Модульное тестирование удаленных методов strongloop loopback.io модель

#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 хотел протестировать.