【问题标题】:Angular, Sinon, promisesAngular、Sinon、承诺
【发布时间】:2015-07-31 22:39:28
【问题描述】:

我无法理解 angular、sinon 和 promises。如果我需要测试这样的东西:

myCtrl.js

angular.module('app')
.controller('myCtrl', ($scope, dataService)=> {

   dataService.list('location').then((lst)=> {
      $scope.list = lst;
   });

});

myCtrl-spec.js

describe('testing controller', ()=> { 

   var locations = ['A','B','C'], dataService, $scope;

   beforeEach(module('app'));

   beforeEach(inject($controller, $rootScope, _dataService_, $q) => {
        dataService = _dataService_;
        $scope = $rootScope.$new();
        let lstStub = sinon.stub(dataService,'list');
        let promise = $q.defer();
        lstStub.withArgs('location').returns(promise);
   }));


   it('gets locations', ()=> {
      $controller('myCtrl', { $scope, dataService });
      $scope.$digest();
      expect($scope.list).to.be.equal(locations);
   })
}) 

如何告诉诗浓 promise 的解决方式?

【问题讨论】:

  • 请注意,$q.defer() 返回的是 deferred 对象,而不是 promise。为此,您需要deferred.promise

标签: angularjs unit-testing mocha.js karma-runner sinon


【解决方案1】:

您可以将locations 作为已解决的承诺值与$q.when 传递给间谍:

 lstStub.withArgs('location').returns($q.when(locations));

它应该可以正常工作。它在您的情况下不起作用的原因是因为您正在从延迟对象创建一个承诺,并且从未以适当的值解决它。

何时(值); 将一个可能是值或(第 3 方)then-able 承诺的对象包装到 $q 承诺中。当您处理的对象可能是也可能不是 Promise 时,或者当 Promise 来自不可信的来源时,这很有用。

【讨论】:

  • 只是在初始化控制器@$controller('myCtrl', { $scope, dataService });时确认您使用的是ES6速记属性,否则会导致语法错误。
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2016-04-29
  • 2018-03-29
相关资源
最近更新 更多