Sinon在测试中存根AngularJS服务

时间:2014-07-16 20:18:06

标签: angularjs testing sinon

而不是手动创建模拟服务,如:

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

然后将其添加到我的$ controller注入中,如:

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

如何使用Sinon存根我的实际服务并将该存根服务注入" mockService"正在注入我的控制器上面?如果我的服务方法被重命名,我的控制器测试将随着我的服务测试而失败,我想要发布我的真实服务。

提前致谢,我希望这是有道理的。

1 个答案:

答案 0 :(得分:16)

您不会将整个服务存根,而不是您想要断言的服务上的方法。所以你让角度正常进行注射,然后将方法存在于你从$ 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);
        });
    });
});