如何与Jasmine测试棱角分明的承诺

How to test angular promise with Jasmine

本文关键字:承诺 Jasmine 测试      更新时间:2023-09-26

下面的测试。当我尝试用Jasmine测试它时,console.login永远不会被调用。代码有什么问题,是与angular还是jasmine有关?

describe("angular test", function() {
  var $q;
  beforeEach(function() {
    angular.mock.inject(function getDependencies(_$q_) {
      $q = _$q_;
    });
  });
  it("angular nested promise with jasmine", function(done) {
    $q(function(resolve, reject) {
        resolve(10);
      })
      .then(function(r) {
        console.log(r);
      })
      .finally(function() {
        done();
      });
  });
})
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/jasmine.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/jasmine.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/jasmine-html.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/boot.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<script src="https://code.angularjs.org/1.4.5/angular-mocks.js"></script>

谢谢Merott,这解决了问题。

第二个问题:

如果我正在测试返回承诺的服务。承诺包含在服务中。我还需要添加该摘要以使其发挥作用。这种消化物是茉莉花需要的,还是正常情况下需要的?(我指的是服务。)

必须通过注入$rootScope并调用$rootScope.$digest()来触发摘要。

describe("angular test", function() {
  var $q, $rootScope;
  beforeEach(function() {
    angular.mock.inject(function getDependencies(_$q_, _$rootScope_) {
      $q = _$q_;
      $rootScope = _$rootScope_;
    });
  });
  it("angular nested promise with jasmine", function(done) {
    $q(function(resolve, reject) {
      console.log('hello');
      resolve(10);
    }).then(function(r) {
      console.log(r);
    }).finally(function() {
      done();
    });
    
    $rootScope.$digest();
  });
})
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/jasmine.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/jasmine.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/jasmine-html.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.3.3/boot.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<script src="https://code.angularjs.org/1.4.5/angular-mocks.js"></script>