Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS-将函数传递给spyOn_Javascript_Angularjs_Unit Testing - Fatal编程技术网

Javascript AngularJS-将函数传递给spyOn

Javascript AngularJS-将函数传递给spyOn,javascript,angularjs,unit-testing,Javascript,Angularjs,Unit Testing,因此,我有一个简单的、淡化的应用程序,它返回北约字母表,然后使用模拟和承诺对其进行单元测试 我正在尝试使用main model的.service()中的spyOn函数。在控制器中,我有一个名为natoAlphabet的延迟承诺,它成功地显示在页面上 起初,我从MainController引用getNato,但我从未将MainController.getNato设置为MainModel.getNato 因此,我在主控制器中添加了: this.getNato = MainModel.getNato

因此,我有一个简单的、淡化的应用程序,它返回北约字母表,然后使用模拟和承诺对其进行单元测试

我正在尝试使用
main model
.service()
中的
spyOn
函数。在控制器中,我有一个名为
natoAlphabet
的延迟承诺,它成功地显示在页面上

起初,我从
MainController
引用
getNato
,但我从未将
MainController.getNato
设置为
MainModel.getNato

因此,我在
主控制器中添加了:

this.getNato = MainModel.getNato;
我得到的错误是:
预期已调用spy getNato。

但是,在
控制台日志
中,如果在每个
之前在顶部附近的
中对被模拟的控制器执行
mockMainCtrl
控制台输出,则会得到
对象{name:“Hello World!”,getNato:Promise}

然后在第一个
it()
test的下面,输出是
Object{name:“Hello World!”}
但是,如果展开该对象,您会得到:

Object {name: "Hello World!"}
    getNato: Promise
    name: "Hello world!";
    __proto__: Object
而在每个
之前的
中,您有
getNato

我的错误 我的错误发生在Jasmine测试运行时,我从行
expect(mockMainCtrl.getNato).toHaveBeenCalled()中得到了
Expected spy getNato调用。
在spec.js上

那么我做错了什么

我认为app.js没有任何问题,因为该页面可以成功阅读承诺

附件: 规格js

describe('Controller: MainCtrl', function() {

  beforeEach(module('app'));

  var $scope, $q, mockMainCtrl, $controller, scope, deferred;

  beforeEach(inject(function($controller, _$rootScope_, _$q_, MainModel) {
    $q = _$q_;
    $scope = _$rootScope_.$new();

    deferred = _$q_.defer();

    mockMainCtrl = $controller('MainCtrl', {
      $scope: $scope,
      MainModel: MainModel
    });

    console.log(mockMainCtrl);
  }));

  it('spied and have been called', function() {
    spyOn(mockMainCtrl, 'getNato');
    console.log(mockMainCtrl);
    expect(mockMainCtrl.getNato).toHaveBeenCalled();
  });

  it('Name from service, instantiated from controller, to be mocked correctly', inject(function() {
    expect(mockMainCtrl.name)
      .toEqual("Hello World!");
  }));

  it('Get [getNato] mocked deferred promise', function(mainCtrl) {
    deferred.resolve([{ id: 1 }, { id: 2 }]);
    $scope.$apply();
    expect($scope.results).not.toBe(undefined);
    expect($scope.results).toEqual(['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India']);
    expect($scope.error).toBe(undefined);
  });
});
var app = angular.module('app', []);

app.service('MainModel', function($q) {
  this.name = "Hello World!";

  var getNato = function() {
    var deferred = $q.defer();
    var theNatoAlphabet = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India'];
    deferred.resolve(theNatoAlphabet);
    return deferred.promise;
  };

  this.getNato = getNato();
});

app.controller('MainCtrl', function($scope, MainModel) {
  this.name = MainModel.name;

  var self = this;

  MainModel.getNato.then(function(data) {
    self.natoAlphabet = data;
    $scope.results = data;
  }).catch(function() {
    $scope.error = 'There has been an error!';
  });

  this.getNato = MainModel.getNato;


});
app.js

describe('Controller: MainCtrl', function() {

  beforeEach(module('app'));

  var $scope, $q, mockMainCtrl, $controller, scope, deferred;

  beforeEach(inject(function($controller, _$rootScope_, _$q_, MainModel) {
    $q = _$q_;
    $scope = _$rootScope_.$new();

    deferred = _$q_.defer();

    mockMainCtrl = $controller('MainCtrl', {
      $scope: $scope,
      MainModel: MainModel
    });

    console.log(mockMainCtrl);
  }));

  it('spied and have been called', function() {
    spyOn(mockMainCtrl, 'getNato');
    console.log(mockMainCtrl);
    expect(mockMainCtrl.getNato).toHaveBeenCalled();
  });

  it('Name from service, instantiated from controller, to be mocked correctly', inject(function() {
    expect(mockMainCtrl.name)
      .toEqual("Hello World!");
  }));

  it('Get [getNato] mocked deferred promise', function(mainCtrl) {
    deferred.resolve([{ id: 1 }, { id: 2 }]);
    $scope.$apply();
    expect($scope.results).not.toBe(undefined);
    expect($scope.results).toEqual(['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India']);
    expect($scope.error).toBe(undefined);
  });
});
var app = angular.module('app', []);

app.service('MainModel', function($q) {
  this.name = "Hello World!";

  var getNato = function() {
    var deferred = $q.defer();
    var theNatoAlphabet = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India'];
    deferred.resolve(theNatoAlphabet);
    return deferred.promise;
  };

  this.getNato = getNato();
});

app.controller('MainCtrl', function($scope, MainModel) {
  this.name = MainModel.name;

  var self = this;

  MainModel.getNato.then(function(data) {
    self.natoAlphabet = data;
    $scope.results = data;
  }).catch(function() {
    $scope.error = 'There has been an error!';
  });

  this.getNato = MainModel.getNato;


});
看看-

您可能希望“间谍”依赖项,即此处的“MainModel”,并在“$controller”构造之前执行此操作,因为“promise”正在解决控制器构造问题。希望这有帮助

类似于-

  beforeEach(inject(function($controller, _$rootScope_, _MainModel_) {
    scope = _$rootScope_.$new();
    MainModel = _MainModel_;
    spyOn(MainModel, 'getNato').andCallThrough();
    mockMainCtrl = $controller('MainCtrl', {
      $scope: scope
    });
  }));

  it('spied and have been called', function() {
    expect(MainModel.getNato).toHaveBeenCalled();
  });