javascript - Jasmine spy 与兑现 promise

标签 javascript angularjs unit-testing karma-jasmine

我正在测试一个使用返回 promise 的服务的 Controller 。我在测试中模拟了一个服务并创建了一个 spy ,以便我可以测试该服务是否确实被调用。

但是我不断收到此错误

TypeError: 'undefined' is not a function 
    (evaluating 'spyOn(mockService, 'one').andReturn(deferred.promise)')

我的测试

beforeEach(inject(function($rootScope, $controller, $q) {
  scope = $rootScope.$new();

  mockService = {
    one: function(){
      // mock promise
      var deferred = $q.defer();
      deferred.resolve([
        //my array
      ]);
      return deferred.promise;
    },
    two: function(){
      // mock promise
      var deferred = $q.defer();
      deferred.resolve([
        //my data
      ]);
      return deferred.promise;
    }
  }
  var deferred = $q.defer();
  spyOn(mockService, 'one').andReturn(deferred.promise);

  controller = $controller('MyCtrl', {
    $scope: scope,
    mockService: mockService
  });
}));

it('should call mockService service', function(){
  //causes promises to check to see if they are fulfilled
  scope.$digest();
  expect(mockService.one).toHaveBeenCalled();
});

最佳答案

对于 Jasmine 2,您必须使用

spyOn(mockService, 'one').and.returnValue(deferred.promise);

而不是andReturn()

Read the docs 。如果您要从 Jasmine 1 迁移到 Jasmine 2,您可能还需要 read this .

关于javascript - Jasmine spy 与兑现 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681239/

相关文章:

javascript - Bootstrap 4 中的输入大小小于 "form-control-sm",例如xs?

javascript - 如何防止 ngInfiniteScroll 在初始触发后被多次触发?

jquery - 使用 jquery element.val() 时 ng-model 不会更新

angularjs - 从模态中获取文本 : Protractor/Webdriver

c# - DataTestMethod 与测试方法

javascript - 使用 CryptoJS 更改 key

javascript - 深度扩展,扩展到对象数组?

javascript - 提取变量中给定字符串后的第一个单词

python - 如何在 Python 单元测试中模拟外部服务器?

c# - MSTEST 中的多个 TestInitialize 属性