Проверьте автономный файл JS в Jasmine / Node.js - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть отдельный файл javascript, cacheBustingInterceptor.js в приложении node.js.Это сервис в фабричном шаблоне, который вызывается app.js, когда приложение удерживается.

/** 
* Intercept the http request 
* If the config.url is from upload or templates and is a html file
* append the cacheBusting Param
* If the template url has query param exisitng
* append &_dt=epochtime else append ?_dt=epochtime
*/
var cacheBustingInterceptor = {
CacheBustingService: CacheBustingServiceFactory
};

function CacheBustingServiceFactory() {
function CacheBustingService() {}

var possibleHtmlPaths = ['templates', 'upload'];
CacheBustingService.prototype.appendCacheBustingParam = function(templateUrl) {
    for (var index = 0; index != possibleHtmlPaths.length; index++) {

        // check if the url has is .html and from upload and templates
        var addCacheBusting = templateUrl.indexOf(possibleHtmlPaths[index]) != - 1 && 
            templateUrl.indexOf('.html') != - 1;
        var hasQueryParams = templateUrl.indexOf('?') != -1;

        if (addCacheBusting) {
            if (hasQueryParams) {
                return templateUrl + window.appendCacheBustingParam;
            } else {
                return templateUrl + window.cacheBustingParam;
            }
        } 
    }
    return templateUrl;
};

CacheBustingService.prototype.interceptRequest = function() {
    var _this = this;
    var cacheBuster = {
        request: function (config) {
            config.url = _this.appendCacheBustingParam(config.url);
            return config;
        }
    }
    return cacheBuster;
}

return CacheBustingService;

}

способ, которым мы вызываем это, добавляя инжектор в app.js в конфиге и выдвигая фабрику к конфигам.

примерно так,

   app. config([''$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.push('templateCacheBustingInjector');

  app.factory('templateCacheBustingInjector', ['$injector', function 
    ($injector) {
    var CacheBustingService = 
         $injector.invoke(cacheBustingInterceptor.CacheBustingService);
         var cacheBustingService = new CacheBustingService();

    return cacheBustingService.interceptRequest();
  }]);

Теперь все это работает нормально, но я хочу провести модульное тестирование метода 'appendCacheBustingParam' в cacheBustingInterceptor.js и нехватку идей для его вызова из модульного теста жасмина

Вещи устали: 1. вызывать так, как я вызывал в app.js, но я получаю ошибку внедрения службы или ошибку провайдера 2. загрузить файл js с помощью require, но require не поддерживается, и я попытался использовать browsify, однако это тоже не помогает,

  require('../main/webapp/media/scripts/cacheBustingInterceptor.js'); 

  fdescribe('Cache Busting Service', function() {
      var cacheBustingService;
       var $injector;

beforeEach((inject(function (_$injector_) {
    $injector = _$injector_;
   $injector.get(cacheBustingInterceptor.CacheBustingService);
    // var CacheBustingService = $injector.invoke(cacheBustingInterceptor.CacheBustingService);
})));

it('Test appendCacheBustingParam', function() {
    cacheBustingService = new CacheBustingService();
    spyOn(cacheBustingService.prototype, 'appendCacheBustingParam');
    expect(cacheBustingService.prototype).toHaveBeenCalled();
});

});

1 Ответ

0 голосов
/ 22 февраля 2019

Я думаю, что здесь есть проблема с терминологией, когда вы говорите «обособленно».

Единица тестирует тестирование изолированной единицы кода.

Интеграция тесты проверяют взаимодействие между изолированными единицами.

A единица тест для вашего метода может быть чем-то вроде

const mock = {}; // fill with appropriate properties
const result = CacheBustingService
  .prototype
  .appendCacheBustingParam
  .call(mock, someURL);

expect(result).toBe(expectedResult);

Юнит-тест не должен требовать подключения службы.Модульные тесты, как правило, должны запускаться на узле из командной строки, в идеале без запуска даже 10 *, потому что вы все заглушили.Ваши юнит-тесты должны выполняться менее чем за секунду.Желательно для всего пакета, но это может быть невозможно в зависимости от размера кодовой базы.

Похоже, что вы хотите, это интеграция тест: действительно ли создание службы подключает все правильно?

В случае интеграционных тестов, имеет смысл на самом деле создать сервис, чтобы выяснить это, имея в виду запуск его в браузере, например, с кармой и фактическими зависимостями (не как автономный).файл).Интеграционные тесты могут быть медленнее / выполняться реже.

Одна заключительная нота

Ваш метод не очень поддается автоматическому тестированию, поскольку он ссылается на глобальные переменные и делает это через окно:

        if (hasQueryParams) {
            return templateUrl + window.appendCacheBustingParam;
        } else {
            return templateUrl + window.cacheBustingParam;
        }

Вместо этого укажите эти параметры в методе.

...