sourcecode

$provid는 'angular.mock.module' 함수에서만 사용할 수 있고 $q는 'angular.mock.inject' 함수에서만 사용할 수 있는 이유는 무엇입니까?

copyscript 2023. 3. 5. 10:17
반응형

$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

반응형