gpt4 book ai didi

unit-testing - 为什么$provide只能在 'angular.mock.module'函数中使用,$q只能在 'angular.mock.inject'函数中使用?

转载 作者:行者123 更新时间:2023-12-03 07:26:01 24 4
gpt4 key购买 nike

我正在模拟 AngularJS 单元测试的服务。我正在使用 $provide 服务将“真实”服务替换为模拟服务(plunker script 可用):

describe('My Controller', function () {

var $scope;
var $provide;

beforeEach(angular.mock.module('myApp'));

beforeEach(angular.mock.module(function (_$provide_) {

$provide = _$provide_;

}));

beforeEach(angular.mock.inject(function($rootScope, $controller, $q){

var mockMyService = {
getAll : function() {
var deferred = $q.defer();
deferred.resolve([
{ itemText: "Foo" },
{ itemText: "Bar" }
]);

return deferred.promise;
}
};

$provide.value('myService', mockMyService);

$scope = $rootScope.$new();

$controller('MyCtrl', { $scope: $scope });

$rootScope.$apply();

}));

it('Has two items defined', function () {
expect($scope.items.length).toEqual(2);
});
});

这工作得很好。但是,我不喜欢这样的事实:我使用 angular.mock.module 函数只是为了提供对 $provide 服务的引用,然后在下面的 angular.mock.inject 函数。但是,如果我直接将 $provide 作为参数添加到 angular.mock.inject 函数中,则会收到“未知提供者”错误。

我想到我可以将所有模拟代码放入 angular.mock.module 函数中。但是,我对 $q 引用也有类似的问题,我需要它,因为我的模拟服务必须返回一个 promise 。

换句话说,如果我向 angular.mock.module 函数添加 $q 参数,那么我也会收到“未知提供者”错误。

有没有办法简化这个过程?显然我所拥有的有效,但不知何故感觉不太对劲。我觉得我不明白为什么有些提供程序可在 inject 函数中使用,而另一些提供程序可在 module 函数中使用。

最佳答案

您不能在 inject 函数中使用 $provide,因为前者注册了提供程序供后者使用。看看:

describe('...', function() {
beforeEach(function() {
module(function($provide) {
$provide.constant('someValue', 'foobar');
});

inject(function(someValue) {
var value = someValue; // will be 'foobar';
});
});
});

您可以这样编写测试:

describe('...', function() {
var serviceMock;

beforeEach(function() {
serviceMock = {
someMethod: function() { ... }
};

module(function($provide) {
$provide.value('service', serviceMock);
});

inject(function(service) {
...
});
});
});

事实上,在使用 $provide 注入(inject)模拟服务之前,您甚至不需要实现它:

beforeEach(function() {
serviceMock = {};

module(function($provide) {
$provide.value('service', serviceMock);
});

inject(function(service) {
...
});
});

it('tests something', function() {
// Arrange
serviceMock.someMethod = function() { ... }

// Act
// does something

// Assert
expect(...).toBe(...);
});

这是一个Plunker script说明了上述大部分内容。

关于unit-testing - 为什么$provide只能在 'angular.mock.module'函数中使用,$q只能在 'angular.mock.inject'函数中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19297258/

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