我的问题与 this post 非常相似但只是不同,接受的答案对我不起作用。本质上,我有一个 Angular 工厂,它使用 $compile,它返回一个 promise ,我想在 Jasmine 中模拟它。这是工厂的简化版本:
angular.module('app.common')
.factory('myFactory', myFactory);
myFactory.$inject = ['$compile', '$rootScope'];
function myFactory($compile, $rootScope) {
var factory = {
testFunc: testFunc
}
return factory;
function testFunc(stuff) {
angular.element(document.body).append($compile(stuff)($rootScope));
}
}
这是我的测试:
describe("Common", function() {
// I have many common services
beforeEach(function() {
angular.mock.module('app.common');
});
describe("Factory Example: ", function() {
var mockCompile, mockRoot, aFactory;
beforeEach(function() {
module(function($provide) {
$provide.value('$compile', jasmine.createSpy('$compile'));
$provide.value('$rootScope', jasmine.createSpy('$rootScope'));
});
});
beforeEach(inject(function($compile, $rootScope, myFactory, $q) {
mockCompile = $compile;
mockCompile = function() {
var deferred = $q.defer();
deferred.resolve('remote call result');
return deferred.promise;
};
mockRoot = $rootScope;
aFactory = myFactory;
}));
it('should work', function() {
aFactory.testFunc('stuff');
expect(true).toBe(true);
});
});
});
这段代码向我提示 $compile 没有返回 promise 。看来 $provide 不知道来自注入(inject)的新函数分配。我一直在研究它,但我对 Jasmine 很陌生,所以我真的不知道我在做什么。任何帮助将不胜感激 - 如果有更简单的方法来完成我想做的事情,请告诉我!
最佳答案
好吧,万岁,我解决了!
对于那些可能对 future 感兴趣的人: 第一个问题是我错误地假设 $compile 返回一个 promise ,但事实并非如此。它返回一个以范围作为参数的函数。如果您确实需要模拟返回 Promise 的函数,请查看 this post这帮助我弄清楚了如何做。
当然,这对我不起作用,因为我所需要做的就是让我的模拟 $compile 返回一个函数。以下代码对我有用:
describe("Common", function() {
// I have many common services
beforeEach(function() {
angular.mock.module('app.common');
});
describe("Factory Example: ", function() {
var mockCompile, mockRoot, aFactory;
beforeEach(function() {
module(function($provide) {
// Just use callFake to have $compile return a function
$provide.value('$compile', jasmine.createSpy().and.callFake(function() {
return function(scope) { scope(); };
});
$provide.value('$rootScope', jasmine.createSpy());
});
});
beforeEach(inject(function($compile, $rootScope, myFactory, $q) {
mockCompile = $compile;
mockRoot = $rootScope;
aFactory = myFactory;
}));
it('should work', function() {
aFactory.testFunc('stuff');
expect(mockCompile).toHaveBeenCalled();
expect(mockRoot).toHaveBeenCalled();
});
});
关于javascript - 使用 Jasmine 测试工厂时如何模拟 $compile 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532152/