Stubbing factory being used in resolve

前端 未结 1 794
一向
一向 2021-01-27 13:29

I\'m trying to unit test my states in an controller. What I want to do is stub out my items factory, since I have separate unit tests that cover that functionality.

1条回答
  •  粉色の甜心
    2021-01-27 14:14

    Allowing real router in unit tests is a bad idea because it breaks the isolation and adds more moving parts. I personally consider $stateProvider, etc. stubs a better testing strategy.

    The order matters in config blocks, service providers should be mocked before they will be injected in other modules. If the original modules have config blocks that override mocked service providers, the modules should be stubbed:

      beforeAll(function () {
        angular.module('ui.router', []);
      });
    
      beforeEach(function () {
        var $stateProviderMock = {
          state: sinon.stub().returnsThis()
        };
    
        module(function($provide) {
          $provide.constant('$stateProvider', $stateProviderMock);
        });
        module('todo');
      });
    

    You just need to make sure that $stateProvider.state is called with expected configuration objects an arguments:

      it('should define home state', function () {
        expect($stateProviderMock.state.callCount).to.equal(1);
    
        let [homeStateName, homeStateObj] = $stateProviderMock.state.getCall(0).args;
    
        expect(homeStateName).to.equal('home');
        expect(homeState).to.be.an('object');
    
        expect(homeState.resolve).to.be.an('object');
        expect(homeState.resolve.items).to.be.an('array');
    
        let resolvedItems = $injector.invoke(homeState.resolve.items);
        expect(items.getAll).to.have.been.calledOnce;
        expect(resolvedItems).to.equal('getAll');
    
        ...
      });
    

    0 讨论(0)
提交回复
热议问题