测试规范在$rootScope之前执行$apply()已完成对promise的解析
Test spec executing before $rootScope.$apply() is done resolving promise
我正在使用带有angular-mocks
'httpBackend
的Jasmine编写角度单元测试
我已经成功地模拟了我的后端,但我的某个测试在http调用中遇到了一些问题,在请求完成后,值被设置为scope
(在then()
中)。
控制器:$scope.startShift
绑定到按钮点击。
app.controller('ShiftStartCntl', function($scope, $rootScope, $location, Restangular, $http, shifts) {
$scope.shifts = shifts;
$scope.startShift = function (category) {
$scope.startingShift = true;
baseShifts.post({category_number: 2})
.then(function (shift) {
$scope.shift = shift;
// breaks here if run as the endpoint isn't mocked
$http.post('endpointThatIsNotMocked').then(function() {});
$location.path($scope.rootURL + '/shift/' + shift.id + '/');
$scope.startingShift = false;
});
});
测试:
// module definition and stuff
//
// [...]
//
describe('ShiftStartCntl', function() {
var scope, rootScope, httpBackend, ShiftStartCntl;
beforeEach(angular.mock.inject(function($rootScope, $controller, $httpBackend) {
scope = $rootScope.$new();
rootScope = $rootScope;
httpBackend = $httpBackend;
// mimics the controller's ng-route `resolve` dependency
shifts = getJSONFixture('leave_shifts.json');
scope.baseShifts = baseApi.all('shifts');
// used in the controller
scope.categories = getJSONFixture('leave_categories.json');
httpBackend.expectPOST('/api/shifts/', {category_number: 2})
.respond(203, {"id": 4, "user": 1,
"category_number": 2,
"sign_in": "2015-02-10T21:29:06.110Z",
"sign_out": null
});
$controller('ShiftStartCntl', {$scope: scope, shifts: []});
}));
it('should start a shift', function() {
expect(shifts.length).toEqual(2);
expect(scope.startingShift).toBe(undefined);
scope.startShift(scope.categories[1]);
rootScope.$apply();
expect(scope.shift.id).toEqual(4);
httpBackend.flush();
});
});
产生的错误如下:
PhantomJS 1.9.8 (Mac OS X) Shifts ShiftStartCntl should start a shift FAILED
Expected undefined to equal 4.
at [...]/js/tests/unit/controllers/main.js:100
Error: Unexpected request: POST yoyoyo
是expect(scope.shift.id).toEqual(4);
所在的线路
我的问题是,关于意外请求的错误应该在执行expect(scope.shift.id).toEqual(4);
之前发生。
正如在一些Stackoverflow的回答和各种博客文章中所读到的,我尝试过使用$rootScope.apply();
,但没有成功。
关于如何解决这个问题,有什么想法吗?
你能试着把httpBackend.flush();
移到上方两行吗
scope.startShift(scope.categories[1]);
httpBackend.flush();
rootScope.$apply();
expect(scope.shift.id).toEqual(4);
相关文章:
- 在动态crm 2011中,右键单击已完成活动的只读文本时,您是否出现错误
- 检查jquery(或ajax)功能是否已完成
- 如何检测我的音频流是:正在播放、暂停还是已完成
- 如何确保 .animate 在再次执行之前已完成
- 回流如何侦听异步操作已完成
- 检查浏览器是否已完成页面加载
- 复选框,将所有已完成的输入字段复制到下面的字段
- 最后一个图像已完成淡入
- 测试规范在$rootScope之前执行$apply()已完成对promise的解析
- 如何检查AJAX请求是否已完成
- 在继续之前,请确保异步GET/POST请求已完成
- angular won't显示范围变量(已完成)
- 如何查找是否所有 ajax 请求都已完成,并且每个请求都使用 Javascript 和/或 JQuery 将数据从服务器
- jQuery:如何检查以确保所有异步操作都已完成
- 检查 URL 是否已完成加载
- 流星 - 创建一个复选框,用于隐藏会话中已完成的决议
- 如何检查挖空是否已完成数据绑定
- 如果操作结果已完成,如何打印结果
- 如何检查窗口是否仍在加载并已完成加载
- 用于 iframe 的 Javascript 事件已完成加载