3 回答

TA貢獻1834條經(jīng)驗 獲得超8個贊
您可以使用來將模擬注入服務中$provide。
如果您具有以下具有依賴項的服務,該服務具有名為getSomething的方法:
angular.module('myModule', [])
.factory('myService', function (myDependency) {
return {
useDependency: function () {
return myDependency.getSomething();
}
};
});
您可以按如下方式注入myDependency的模擬版本:
describe('Service: myService', function () {
var mockDependency;
beforeEach(module('myModule'));
beforeEach(function () {
mockDependency = {
getSomething: function () {
return 'mockReturnValue';
}
};
module(function ($provide) {
$provide.value('myDependency', mockDependency);
});
});
it('should return value from mock dependency', inject(function (myService) {
expect(myService.useDependency()).toBe('mockReturnValue');
}));
});
請注意,由于有調用,$provide.value因此實際上不需要在任何地方顯式注入myDependency。它發(fā)生在注入myService的過程中。在此處設置嘲諷依賴時,它可能同樣容易成為間諜。

TA貢獻1946條經(jīng)驗 獲得超3個贊
從我的角度來看,無需自己模擬服務。只需在服務上模擬功能。這樣,您就可以像在整個應用程序中一樣對您的真實服務進行有角度的注入。然后,使用Jasmine的spyOn功能根據(jù)需要在服務上模擬功能。
現(xiàn)在,如果服務本身是一個函數(shù),而不是可以使用的對象spyOn,則還有另一種解決方法。我需要執(zhí)行此操作,然后發(fā)現(xiàn)一些對我來說非常有效的方法。

TA貢獻1845條經(jīng)驗 獲得超8個贊
除了John Galambos的回答:如果您只想模擬服務的特定方法,則可以這樣做:
describe('Service: myService', function () {
var mockDependency;
beforeEach(module('myModule'));
beforeEach(module(function ($provide, myDependencyProvider) {
// Get an instance of the real service, then modify specific functions
mockDependency = myDependencyProvider.$get();
mockDependency.getSomething = function() { return 'mockReturnValue'; };
$provide.value('myDependency', mockDependency);
});
it('should return value from mock dependency', inject(function (myService) {
expect(myService.useDependency()).toBe('mockReturnValue');
}));
});
添加回答
舉報