我有几个我在几个项目中使用的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
});
});
帮助程序本身位于规范帮助程序文件中,该文件包含在karma.conf.js
:
files: [
// ....
'test/helper/**/*.js',
// ...
],
所以我的问题是:
expect(...)
方法)。什么是正确的方法来做到这一点?因为我需要安哥拉' $q
和$rootScope
模块,我认为在茉莉花内部它们是不可用的。我是对的吗?欢迎任何指向教程,代码示例和资源的链接!
目前我有以下解决方案:
(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(...)
中书写,而且您不必一次又一次地注入整个事物。
您怎么看?这种做法好吗?或者有更好的解决方案吗?