Angular Karma / Jasmine测试:如何使用promises在控制器中模拟服务?

时间:2017-01-18 19:01:58

标签: angularjs unit-testing karma-runner karma-jasmine

我正在尝试对我的控制器进行单元测试。我试图进行单元测试的功能是:

    function myFunction() {

        MyService
            .myMethod(thing1, thing2)
            .then(function handleMyMethod(result) {
                SomeModule.errorHandler(result)
                    .onSuccess(function onSuccess() {
                        // do stuff
                    })
                    .onError(function onError() {
                        // do stuff
                    });
            });
    }

相关测试文件摘要:

var MockService = {
  myMethod: function(thing1, thing2) {
   var promise = $q.defer().promise;
   return promise;
 }
};

beforeEach(module(function($provide) {
  $provide.value('MyService', MockService);
}));

beforeEach(inject(function (_$controller_, _MyService_, _SomeModule_, ...) {
  ...
  MyService = _MyService_;

  MyController = _$controller_('MyController as Ctrl', {
    $controller: controller,
    MyService: MockService,
  }); 

我对如何编写允许我同时触及onSuccess和onError情况的测试感到困惑。我试图覆盖分支覆盖的两个分支,但不知道语法如何工作。

1 个答案:

答案 0 :(得分:0)

您可以采取以下两种方式之一:

  1. 您可以编写模拟服务来查看参数并解决错误或成功。
  2.     myMethod:function(thing1, thing2) {
            if (thing1=='all good') return $q.when('excellent');
            return $q.reject('sorry, bud');
        }
    
    1. 您可以将方法覆盖到您调用它的位置附近。
    2. it('is a success', function() {
          spyOn(MockService, 'myMethod').and.returnValue($q.when('excellent');
          $rootScope.$apply(
              MyController.doStuff('foo');
          );
          expect(MyController.someProperty).toEqual('excellent');
      });
      //etc.
      

      请注意,您不需要使用提供代码覆盖模块注入器,并在$ controller locals参数中提供模拟服务。