#npm #bower
#npm #беседка
Вопрос:
У меня есть куча помощников по тестированию для angularjs, которые я использую в нескольких проектах. Я хочу упаковать их в модуль / пакет npm или bower, чтобы легко использовать их повторно и делиться ими. Но я не уверен, как правильно это сделать.
Помощник выглядит следующим образом:
(function() {
var spyHelper = angular.module("spyHelper", []);
spyHelper.factory("spyOnPromise", ["$q", "$rootScope", function($q, $rootScope) {
return function(service, functionName, args) {
var deferred = $q.defer();
var spy = spyOn(service, functionName).andReturn(deferred.promise);
spy.resolve = function(value) {
deferred.resolve(value);
$rootScope.$apply();
return spy;
}
spy.reject = function(value) {
deferred.reject(value);
$rootScope.$apply();
return spy;
}
return spy;
}
}]);
beforeEach(module("spyHelper"));
})();
И он используется в моих тестах следующим образом:
describe('myService', function () {
beforeEach(module('myApp'));
var spyOnPromise, myService;
beforeEach(inject(function(_spyOnPromise_, _myService_) {
spyOnPromise = _spyOnPromise_;
myService = _myService_;
}));
it("should revolve a promise", function() {
spyOnPromise(myService, "fetch").resolve();
// ... do some other stuff
});
});
Сам помощник находится в файле spec helper, который включается внутрь karma.conf.js
:
files: [
// ....
'test/helper/**/*.js',
// ...
],
Итак, мои вопросы:
- Помощник вводится как модули, и это немного раздражает. Я использую jasmine, и было бы здорово извлечь их в некоторые помощники jasmine (например, мне не нужно вводить что-либо, чтобы использовать
expect(...)
метод jasmines).). Как правильно это сделать? Потому что мне нужны модули angulars$q
и$rootScope
, и я думаю, что внутри jasmine они были бы недоступны. Я прав? - Должен ли я упаковать все это в беседку или модуль / пакет npm?
- У меня также есть несколько тестовых помощников, которые расширяют jQuery для целей тестирования. Каков был бы правильный способ объединить их в некоторые повторно используемые модули test helper?
Любые ссылки на учебные пособия, примеры кода, ресурсы приветствуются!
Обновить
В настоящее время у меня есть следующее решение:
(function() {
var injector = angular.injector(['ng']);
var $q = injector.get("$q");
var $rootScope = injector.get("$rootScope");
this.spyOnPromise = function(service, functionName, args) {
var deferred = $q.defer();
var spy = spyOn(service, functionName).andReturn(deferred.promise);
spy.andResolveWith = function(value) {
deferred.resolve(value);
$rootScope.$apply();
return spy;
};
spy.andRejectWith = function(value) {
deferred.reject(value);
$rootScope.$apply();
return spy;
};
return spy;
};
}).call(this);
С помощью этого решения вы можете просто записывать свои тесты spyOnPromise(...)
, и вам не нужно вводить все это снова и снова.
Как вы думаете, этот подход подходит? Или есть лучшее решение?