AngularJs 单元测试 - 模拟承诺不执行“然后”
AngularJs unit test - mocked promise not executing "then"
我们正在对控制器进行单元测试。我们已经成功地模拟了对 REST 服务层的调用,并验证了它确实是使用给定数据调用的。但是,现在我们想测试一下,在我们的控制器中,then
承诺的执行会改变location.path
:
控制器:
(function () {
app.controller('registerController', ['$scope', '$location', '$ourRestWrapper', function ($scope, $location, $ourRestWrapper) {
$scope.submitReg = function(){
// test will execute this
var promise = $ourRestWrapper.post('user/registration', $scope.register);
promise.then(function(response) {
console.log("success!"); // test never hits here
$location.path("/");
},
function(error) {
console.log("error!"); // test never hits here
$location.path("/error");
}
);
};
$ourRestWrapper.post(url,data)
只是包裹Restangular.all(url).post(data)
..
我们的测试:
(function () {
describe("controller: registerController", function() {
var scope, location, restMock, controller, q, deferred;
beforeEach(module("ourModule"));
beforeEach(function() {
restMock = {
post: function(url, model) {
console.log("deferring...");
deferred = q.defer();
return deferred.promise;
}
};
});
// init controller for test
beforeEach(inject(function($controller, $rootScope, $ourRestWrapper, $location, $q){
scope = $rootScope.$new();
location = $location;
q = $q;
controller = $controller('registerController', {
$scope: scope, $location: location, $ourRestWrapper: restMock});
}));
it('should call REST layer with registration request', function() {
scope.register = {data:'test'};
spyOn(restMock, 'post').andCallThrough();
scope.submitReg();
deferred.resolve();
// successfull
expect(restMock.post).toHaveBeenCalledWith('user/registration',scope.register);
expect(restMock.post.calls.length).toEqual(1);
// fail: Expected '' to be '/'.
expect(location.path()).toBe('/');
});
在我们的控制台中,我们看到"延迟..."前两个期望成功了。为什么它不会调用then
块(即设置位置)?
从注入器获取$rootscope
对象时缓存它,并在deferred.resolve()
后立即调用$rootScope.$apply()
。
相关文章:
- 如何在VB中先执行客户端代码,然后再执行服务器端代码
- Node.js:多个然后'It’执行顺序不正确
- onchange选择get value并执行查询,然后在同一页面上显示结果
- 加载页面,然后在页面加载时执行 javascript
- 流星技术/模式,用于等待数据库变量更改,然后在 in 之后执行某些操作
- Javascript Promise().然后防止在执行第一个调用之前重新调用该函数
- JQuery/JavaScript:遍历表单字段,执行计算,然后提交
- jQuery-等待此元素,然后执行1次
- 一键点击首先调用javascript,执行验证,然后调用控制器方法
- 方法来查看jQuery文件是否已完全加载,然后执行与其相关的函数
- 识别javascript,然后执行“;包括“;
- 单击链接时执行异步AJAX调用,然后跟随该链接
- 如何检查窗口是否已滚动到href,然后在javascript/jQuery中执行函数
- 执行 ajax 同步 POST 然后提交表单的正确方法
- 等待 AJAX,然后再继续执行单独的函数
- 如何将 $http.put 封装到一个函数中,该函数执行某些操作,然后返回通过或失败的承诺
- 如何首先执行函数,然后发送静态文件
- 首先验证表单,然后执行 Ajax 调用
- Phantomjs 检查响应标头,然后执行某些操作
- AngularJs 单元测试 - 模拟承诺不执行“然后”