模拟承诺链功能

Mocking promise chain function

我正在为 angular 控制器编写测试用例。我在模拟服务 API 调用时遇到了一个问题。 我的控制器 api 调用是:

 this.testMe = User.getDetails().then(function (response) {
            this.user = response.data;

        }.bind(this), function (response) {
            console.log("error function mocking")
        });

在我的测试用例中,我想模拟这个服务“User”的方法“getDetails”。所以我的测试用例模拟是这样的:

   this.getCurrentUserDetails = function () {
                    var deferred = $q.defer();
                    deferred.resolve({data: 'test'});
                    return deferred.promise;
                };

当我 运行 测试用例时,它给我这样的错误:

'undefined' is not a function (near '...}.bind(this), function (re...')

在我的 API 调用中有 bind() 函数,控制器无法找到它。那么我怎样才能用 bind() 函数模拟服务呢。

您正在控制器中使用 Function.prototype.bind}.bind(this) 位)。 PhantomJS 1.x has not implemented bind() 所以你不能在测试运行器中使用它。

您的选择是...

  1. 安装 bind-polyfill(最好在您的 Bower devDependencies 中)并将其包含在您的 karma.conf.js 文件中

  2. 别名this

    var ctrl = this;
    this.testMe = User.getDetails().then(function (response) {
        ctrl.user = response.data;
    }, function (response) {
        console.log("error function mocking")
    });
    
  3. 如果您使用的是下划线/lodash,请尝试使用 _.bind 函数

    this.testMe = User.getDetails().then(_.bind(function (response) {
        ctrl.user = response.data;
    }, this)
    
  4. 在您的 karma.conf.js 文件中使用不同的浏览器

    browsers : ['Chrome'],
    
    plugins : [
        'karma-chrome-launcher',
        'karma-jasmine'
    ]