【问题标题】:test service call with success () , error () in jasmine在 jasmine 中使用成功 () 和错误 () 测试服务调用
【发布时间】:2015-08-25 17:06:24
【问题描述】:

这是我的控制器中的功能之一

function sendMeetingInvitation(companyId, meetingId) {

  meetingService.sendInvitations(companyId, meetingId)
    .success(function() {
      $state.go('company.meeting.view', {}, {
        reload: true
      });
    })
    .error(function() {
      //more code for error handling
    });

}

下面是我在调用sendMeetingInvitation()时用来测试的测试用例,是否应该调用meetingService.sendInvitations的服务调用的success()

describe('EditMeetingCtrl.sendMeetingInvitation()', function() {
  var $rootScope, scope, $controller, $q, companyService, meetingService;



  var mockedHttpPromise = {
    success: function() {}
  };

  beforeEach(angular.mock.module('MyApp'));


  beforeEach(angular.mock.inject(function(_$httpBackend_, _companyService_, _meetingService_) {
    $httpBackend = _$httpBackend_;
    companyService = _companyService_;
    meetingService = _meetingService_;
  }));

  beforeEach(inject(function($rootScope, $controller, _meetingService_) {
    scope = $rootScope.$new();
    createController = function() {
      return $controller('EditMeetingCtrl', {
        $scope: scope,
        meeting: {},
        meetingService: _meetingService_
      });
    };
    var controller = new createController();
  }));

  it("should should send invitations", function() {
    spyOn(meetingService, 'sendInvitations').and.returnValue(mockedHttpPromise);
    scope.sendMeetingInvitations(123456, 123456);
    expect(meetingService.sendInvitations).toHaveBeenCalledWith(123456, 123456);
  });


});

我收到了这个错误,它并没有什么帮助。

PhantomJS 1.9.8 (Windows 8) In EditMeetingCtrl EditMeetingCtrl.sendMeetingInvitation() should should send invitations FAILED
TypeError: 'undefined' is not an object (near '...})...')

我在这里做错了什么?我试过我的mockedHttpPromise 来关注。但结果相同

var mockedHttpPromise = {
  success: function() {},
  error: function() {}
};

【问题讨论】:

  • 我遇到了同样的问题,我的成功运行良好,但它与 .error 的链接是未定义的。我通过不依赖控制器中的 success().error() 并切换到仅使用 .then () 解决了这个问题
  • 嗨@Malik 运气好吗?请让我知道我也面临同样的问题。更改要使用的代码对我来说不是一个选项,因为源代码是由其他团队开发的,无法更改。

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


【解决方案1】:

函数 sendInvitations 期望返回一个 promise,因此,您需要做的是创建一个 defer 并返回它,如下所示:

-首先需要注入$q:$q = $injector.get('$q');

-创建延迟:deferred = $q.defer();

您的函数 mockedHttpPromise 应该如下所示:

function mockedHttpPromise() {
    deferred = $q.defer();
    return deferred.promise;
}

在你的测试中:

  it("should should send invitations", function() {
    spyOn(meetingService, 'sendInvitations').and.returnValue(mockedHttpPromise);
    scope.sendMeetingInvitations(123456, 123456);
    deferred.resolve({});
    scope.$apply();
    expect(meetingService.sendInvitations).toHaveBeenCalledWith(123456, 123456);
  });

要测试错误块,请将deferred.resolve 更改为deferred.reject

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2012-10-12
    相关资源
    最近更新 更多