模拟承诺链功能
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()
所以你不能在测试运行器中使用它。
您的选择是...
安装 bind-polyfill(最好在您的 Bower devDependencies
中)并将其包含在您的 karma.conf.js
文件中
别名this
var ctrl = this;
this.testMe = User.getDetails().then(function (response) {
ctrl.user = response.data;
}, function (response) {
console.log("error function mocking")
});
如果您使用的是下划线/lodash,请尝试使用 _.bind
函数
this.testMe = User.getDetails().then(_.bind(function (response) {
ctrl.user = response.data;
}, this)
在您的 karma.conf.js
文件中使用不同的浏览器
browsers : ['Chrome'],
plugins : [
'karma-chrome-launcher',
'karma-jasmine'
]
我正在为 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()
所以你不能在测试运行器中使用它。
您的选择是...
安装 bind-polyfill(最好在您的 Bower
devDependencies
中)并将其包含在您的karma.conf.js
文件中别名
this
var ctrl = this; this.testMe = User.getDetails().then(function (response) { ctrl.user = response.data; }, function (response) { console.log("error function mocking") });
如果您使用的是下划线/lodash,请尝试使用
_.bind
函数this.testMe = User.getDetails().then(_.bind(function (response) { ctrl.user = response.data; }, this)
在您的
karma.conf.js
文件中使用不同的浏览器browsers : ['Chrome'], plugins : [ 'karma-chrome-launcher', 'karma-jasmine' ]