承诺没有被处理 [英] Promise is not being handled

查看:186
本文介绍了承诺没有被处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的茉莉花的使用模拟服务,写我的的应用程序中的单元测试。然而,承诺我试图运行不工作。

I am writing a unit test for my Angular application using Jasmine with a mock service. However, the promise I am trying to run is not working.

这里的服务:

CreateItemController = $controller('CreateItemController', {
    ItemService: {

        createItem: function(data) {
            console.log('Service running');
            var defer = $q.defer();
            defer.resolve('1');
            return defer.promise;   
        }

测试:

it('should create an item', function() {

    var created = false;
    $scope.createItem().then(function(response) {
        // This is not being run                
        console.log("We got through");
        created = true;
    });

    expect(created).toBe(true);

})

和最后实际的功能:

    $scope.createItem = function() {
        var postData = {
            name: 'Jeans'
        };

        return ItemService.createItem(postData).then(function(response) {
            // This is not being run                
            console.log('Promise recieved');
        });
    }

我在做什么错了?

What am I doing wrong?

推荐答案

您应该嘲笑$ Q服务,使承诺的分辨率为不是异步再在您的测试。

You should mock the $q service so that the resolution of the promise is not async anymore in your test.

有没有点测试$ Q服务本身,你只是想测试你的自定义逻辑。

There is no point testing the $q service itself, you only want to test your custom logic.

  describe('controller: CreateItemController', function () {
    var subject, $scope;
    beforeEach(module('myModule'));
    beforeEach(inject(function ($rootScope, $controller, $q) {
      $scope = $rootScope.$new();

      subject = $controller('CreateItemController', {
        $scope: $scope,
        ItemService: {
          createItem: function () {
            var defer = $q.defer();
            spyOn(defer.promise, 'then').andCallFake(function (callback) {
              callback();
              return this;
            });
            return defer.promise;
          }
        }
      });
    }));

    it('should create an item', function () {
      var created = false;
      var subject = $scope.createItem().then(function () {
        created = true;
      });

      //deferred.resolve('1'); // useless as our callbacks are called as soon as they are registered

      expect(created).toEqual(true);
    });
  });


如果你想的保持延迟虽然,你可以调用$ $范围内解决的递延对象如下申请后():


If you want to keep the delay though, you could call $scope.$apply() after resolving the deferred object as follow:

  describe('controlle: stack overflow', function () {
    var subject, $scope, deferred;
    beforeEach(module('myModule'));
    beforeEach(inject(function ($rootScope, $controller, $q) {
      $scope = $rootScope.$new();

      subject = $controller('CreateItemController', {
        $scope: $scope,
        ItemService: {
        createItem: function () {
            deferred = $q.defer();
            return deferred.promise;
          }
        }
      });
    }));

    it('should create an item', function () {
      var expected = {
        one: false,
        two: false,
      };
      var subject = $scope.createItem();
      subject.then(function () {
        expected.one = true;
      }).then(function () {
        expected.two = true;
      });

      deferred.resolve();
      expect(expected.one).toEqual(false);
      expect(expected.two).toEqual(false);

      $scope.$apply();

      expect(expected.one).toEqual(true);
      expect(expected.two).toEqual(true);
    });
  });
});

这篇关于承诺没有被处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆