Sinon заглушит сервис AngularJS в тестах

Вместо создания фиктивного сервиса вручную, например:

var mockService = { GetData: function() { deferred = $q.defer(); return deferred.promise; }

А затем добавить его в мою инъекцию $controller, например:

$controller('mycontroller', { $scope: scope, myService: mockService });

Как я могу заглушить свою настоящую службу с помощью Sinon и внедрить эту заглушенную службу, где «mockService» вводится в мой контроллер выше? Я хотел бы заглушить свою настоящую службу на случай, если мои методы службы будут переименованы, тогда мои тесты контроллера не пройдут вместе с моими тестами службы.

Заранее спасибо, и я надеюсь, что это имеет смысл.


person Steven Rogers    schedule 16.07.2014    source источник


Ответы (1)


Вы не заглушаете весь сервис, а методы в этом сервисе, на которых хотите утвердить. поэтому вы позволяете angular выполнять инъекцию в обычном режиме, а затем отключаете методы службы, которую вы получаете от $injector, то есть вам не нужно делать ничего странного, поскольку службы являются синглетами в рамках одного теста.

Я всегда создаю песочницу sinon и издеваюсь над ней - тогда после каждого теста вы можете восстановить все издевательские методы.

var sandbox, myService, somethingUnderTest;

beforeEach(module('myModule'));

describe('something', function () {
    beforeEach(inject(function ($injector) {
        sandbox = sinon.sandbox.create();
        myService = $injector.get('myService');
        somethingUnderTest = $injector.get('somethingUnderTest');
    }));

    afterEach(function () {
        sandbox.restore();
    });

    it('should be defined', function () {
        expect(somethingUnderTest).to.exist;
    });

    describe('someMethod', function () {
        it('should call the start method on myService', function () {
            sandbox.stub(myService, 'start');

            somethingUnderTest.start();

            expect(myService.start.calledOnce).to.equal(true);
        });
    });
});
person Jon    schedule 16.07.2014
comment
просто чтобы добавить комментарий к приведенному выше решению, заглушка sinon обладает всеми неотъемлемыми свойствами шпиона. - person prasanth shenoy; 24.11.2018