繁体   English   中英

Angular Karma / Jasmine测试:如何在带有承诺的控制器中模拟服务?

[英]Angular Karma/Jasmine testing: How to mock a service in controller with promises?

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

    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. 您可以编写模拟服务来查看参数,并通过错误或成功进行解析。
myMethod:function(thing1, thing2) {
        if (thing1=='all good') return $q.when('excellent');
        return $q.reject('sorry, bud');
    }
  1. 您可以在靠近调用方法的位置覆盖该方法。
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参数中提供模拟服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM