gpt4 book ai didi

unit-testing - Angularjs - 如何用模拟正确替换服务依赖

转载 作者:行者123 更新时间:2023-12-03 07:44:57 25 4
gpt4 key购买 nike

我正在使用 yeoman 生成器创建的应用程序,并在 karma 中进行测试。

我的每项服务都有可重用的模拟对象。我如何正确地用模拟替换特定的服务依赖项,以便我可以使用 jasmine 来监视方法

到目前为止我已经这样做了:

我的服务:

angular.module('ql')
.service('loginService', ['$http','API','authService', function ($http, API, authService) {
return {
//service implementation
}]);

authService 的模拟:

'use strict';
//lets mock http auth service, so it would be spied upon.
ql.mock.$authServiceMockProvider = function() {
this.$get = function() {
var $service = {
loginConfirmed: function() { }
};
return $service;
};
};

//and register it.
angular.module('qlMock').provider({
$authServiceMock: ql.mock.$authServiceMockProvider
});

我的测试:

'use strict';

describe('When i call login method()', function () {

// load the service's module
beforeEach(module('ql'));
beforeEach(angular.mock.module('qlMock'));

// instantiate service
var loginService,
authService,
$httpBackend;
beforeEach(function() {
// replace auth service with a mock.
// this seems kind of dirty... is there a bettery way?
module(function($provide, $injector){
authService = $injector.get('$authServiceMockProvider').$get();
$provide.value('authService', authService);
});

//actually get the loginService
/*jshint camelcase: false */
inject(function(_loginService_, _$httpBackend_) {
loginService = _loginService_;
$httpBackend =_$httpBackend_;
});

//http auth module method, that should be call only on success scenarios
spyOn(authService, 'loginConfirmed').andCallThrough();
});
it('it should do something', function () {
//actual test logic
});
});

我不喜欢的是这行:

authService = $injector.get('$authServiceMockProvider').$get();

我想简单地以某种方式获取 authServiceMock (无需获取提供程序,并调用 et 方法),然后将其注入(inject)到 loginService 中。

我知道我可以简单地调用我的 $authServiceMock authService,并将其作为模拟提供,以便它始终会覆盖我的默认实现,但我不想这样做。

最佳答案

我知道这已经晚了,但也许它会对偶然看到这篇文章的人有所帮助。

使用 Angular 的 $provide 在 Jasmine 中模拟服务非常简单服务。技巧是在注入(inject)服务之前使用 $provide 替换服务实现。

例如,假设我们正在测试一项使用 $location 的服务。服务获取有关当前 URL 的信息。

// load the service's module under test
beforeEach(module('myExampleModule'));

// mock out $location with a fake one
beforeEach(module(function ($provide) {

//create mock impl
var mockLocation = {
path: function(){
return '/somewhere'
}
}

$provide.value('$location', mockLocation); // use $provide to swap the real $location with our mock
}));

var $location;
// inject dependencies ($location will be our mocked $location)
beforeEach(inject(function (_$location_) {
$location = _$location_;
}));

it('should return mock url', function(){
var path = $location.path();
expect(path).toBe('/somewhere'); //Assert that $location.path() returns '/somewhere'
});

关于unit-testing - Angularjs - 如何用模拟正确替换服务依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com