$provid는 'angular.mock.module' 함수에서만 사용할 수 있고 $q는 'angular.mock.inject' 함수에서만 사용할 수 있는 이유는 무엇입니까?
앵글을 위한 서비스를 조롱하고 있습니다JS 유닛 테스트를 사용하고 있습니다.$provide
'실제' 서비스를 조롱된 서비스로 대체하기 위한 서비스(이 서비스의 플런커 스크립트를 이용할 수 있습니다.
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
내 조롱당한 서비스가 약속을 돌려줘야 하기 때문에 내가 필요로 하는 레퍼런스.
바꿔 말하면, If I adding the private communications.$q
에 대한 파라미터angular.mock.module
'알 수 없는 프로바이더' 오류도 표시됩니다.
이것을 간소화하는 방법이 있습니까?분명히 내가 가지고 있는 것은 효과가 있지만 왠지 느낌이 좋지 않다.왜 일부 프로바이더를 이용할 수 있는지에 대한 이해가 부족한 것 같습니다.inject
기능 등은 에서 이용할 수 있습니다.module
기능들.
사용할 수 없습니다.$provide
의 범위 내에서inject
전자가 프로바이더를 등록하고 후자가 사용하기 때문에 기능합니다.다음 항목을 참조하십시오.
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
:
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 스크립트입니다.
이 방법은 서비스를 포장해야 할 때 효과가 있었습니다.$q
꽤 깨끗해 보입니다.
var _ServiceToTest_;
beforeEach(function () {
module('module.being.tested');
module(function ($provide) {
$provide.factory('ServiceToMock', function ($q, $rootScope) {
var service = ...;
// use $q et al to heart's content
return service;
});
});
inject(function (_ServiceToTest_) {
ServiceToTest = _ServiceToTest_;
});
});
it('...', function () { /* code using ServiceToTest */ });
요령이라면,$provide.factory
대신$provide.value
.
언급URL : https://stackoverflow.com/questions/19297258/why-is-provide-only-available-in-the-angular-mock-module-function-and-q-onl
'sourcecode' 카테고리의 다른 글
VSCode에서 *not* 파일에 대한 TypeScript 오류를 표시하도록 하려면 어떻게 해야 합니까? (0) | 2023.03.05 |
---|---|
Angular delferred 상태를 가져오시겠습니까? (0) | 2023.03.05 |
입력 자동 포커스 속성 (0) | 2023.03.05 |
프로파일링 조언 - 사이트 로딩 문제를 특정하려고 합니다. (0) | 2023.03.05 |
iframe에서 상위 창의 요소에 액세스합니다. (0) | 2023.03.05 |