Sinon间谍:试图包裹未定义的属性'路径'作为功​​能

时间:2017-03-17 18:28:01

标签: angularjs unit-testing sinon sinon-chai

location.path上的以下间谍失败并显示错误:

  

尝试将未定义的属性路径包装为函数

it('should redirect location.path', function() {
 sinon.spy(location, 'path');
 scope.create();
 expect(location.path).to.have.been.calledOnce;
 location.path.restore();

模拟控制器:

describe('AdminUsersController', function() {
  var Users;
  beforeEach(inject(function(_$controller_, $rootScope, $location, _Users_, _$httpBackend_) {
    var location;
    scope = $rootScope.$new();
    location = $location;
    controller = _$controller_('AdminUsersController', {
      $scope: scope,
      $location: location
    });

我尝试测试的行:

$scope.create = function() {
  return $location.path("admin/users/newuser?create");
};

1 个答案:

答案 0 :(得分:0)

这个问题的解决方案是另一个愚蠢的coffeescript事情。我之前没有定义过位置。我的代码,在coffeescript中,如下:

describe 'AdminControllers', () ->

  scope = undefined
  location = undefined
  $httpBackend = undefined

  beforeEach module 'heliotrope.controllers.admin'

  describe 'AdminUsersController', () ->

    beforeEach inject (_$controller_, $rootScope, $location, _Users_, _$httpBackend_) ->
      scope = $rootScope.$new()
      location = $location
      controller = _$controller_ 'AdminUsersController', {
        $scope: scope
        $location: location
      }
      $httpBackend = _$httpBackend_

    describe 'creating a new user', () ->

      it 'should redirect location.path', () ->
        sinon.spy(location, 'path')
        scope.create()
        expect(location.path).to.have.been.calledOnce
        location.path.restore()