3

我正在使用 Karma、Mocha、Sinon 和 Chai 进行 Angular 单元测试,并且试图弄清楚如何模拟我在控制器中使用$location.

我的控制器执行以下重定向:

$location.path('home');

我想尝试使用间谍来模拟重定向,这就是我目前正在做的事情:

describe('Auth Controller', function() {
  var controller;
  var $location;

  beforeEach(function() {
    bard.appModule('app.auth');
    bard.inject('$controller', '$rootScope', '$location');
  });

  beforeEach(function() {
    $location = {
      path: sinon.spy().returned('Fake location')
    };
    controller = $controller('authCtrl', { $scope: $rootScope, $location: $location });
  });

  it('should take you to the metrics page on successful login', function() {
    expect($location.path).to.have.been.calledWith("Fake location");
  });

});

我收到以下错误:

TypeError: false 不是间谍或对间谍的调用!

我不确定如何正确地模拟这个,或者我是否以正确的方式来处理这个。

对单元测试专家的任何帮助表示赞赏。提前致谢!

4

1 回答 1

3

您可以像这样使用 Spies 来测试 location.path (请参阅此处的 fe:使用 jasmine Spies 对服务方法调用进行 Spy):

var location, objectUnderTest;

beforeEach(inject(function($location){
  location = $location;
}));
function YourCtrlMaker() {
    objectUnderTest = $controller('YourCtrl', {
        $scope: $scope,
        $location: location,
        $routeParams: $routeParams,
    })
}
it('should test location.path', function(){
  spyOn(location, 'path');
  YourCtrlMaker();
  $scope.$root.$digest();
  expect(location.path).toHaveBeenCalledWith('example.com/objects/');
});
于 2016-03-17T13:54:24.773 回答