使用 Jasmine 和 AngularJS 的未刷新请求
Unflushed Requests using Jasmine and AngularJS
自从我尝试使用 $httpBackend.verifyNoOustandingRequest() 以来,我在通过一些测试时遇到了问题。
如果我不在我的 afterEach 函数中包含它,那么测试会通过,但是当我这样做时,除了最后一个 'should load items from the server' 之外,我的所有测试都会失败。每个失败的测试响应与最后一个测试相差 'Error: unflushed request: 1'。
我不明白的是,我认为您只需要担心 flush 是在模拟 ajax 请求时,但它除了我的实际服务器测试外都失败了。
如有任何帮助,我们将不胜感激。
describe('controller: ListCtrl', function(){
beforeEach(module('notesApp'));
var ctrl, loc, mockService, itemServiceS, mockBackend;
beforeEach(inject(function($controller, $location, ItemService, $httpBackend){
spyOn(ItemService, 'list').and.returnValue([{id: 1, label: 'First', done: true}]);
itemService = ItemService;
mockBackend = $httpBackend;
mockBackend.expectGET('/api/note').respond([{id: 1, label: 'Mock'}]);
ctrl = $controller('ListCtrl');
loc = $location;
}));
it('Should have items available on load', function(){
expect(ctrl.items).toEqual([
{id: 1, label: 'First', done: true},
{id: 2, label: 'Second', done: false}
]);
});
it('Should have highlight items based on state', function(){
var item = {id: 1, label: 'First', done: true};
var actualClass = ctrl.getDoneClass(item);
expect(actualClass.finished).toBeTruthy();
expect(actualClass.unfinished).toBeFalsy();
item.done = false;
actualClass = ctrl.getDoneClass(item);
expect(actualClass.finished).toBeFalsy();
expect(actualClass.unfinished).toBeTruthy()
});
it('should change the url', function(){
expect(loc.path()).toEqual('');
ctrl.navigate1();
expect(loc.path()).toEqual('/some/where/else');
});
it('Should change the url to /some/where', function(){
expect(loc.path()).toEqual('');
ctrl.navigate2();
expect(loc.path()).toEqual('/some/where');
});
it('Should have called through ItemService factory', function(){
expect(itemService.list).toHaveBeenCalled();
expect(itemService.list.calls.count()).toEqual(1);
expect(ctrl.itemsGet).toEqual([{id: 1, label: 'First', done: true}]);
});
it('Should load items from server', function(){
expect(ctrl.retrievedItems).toEqual([]);
mockBackend.flush();
expect(ctrl.retrievedItems.data).toEqual([{id: 1, label: 'Mock'}]);
});
afterEach(function(){
mockBackend.verifyNoOutstandingExpectation();
mockBackend.verifyNoOutstandingRequest();
})
});
没有看到您的控制器代码我不能确定,但模拟 API 请求似乎是控制器初始化的一部分。因此,总是会发出请求,并且必须始终刷新它以满足 afterEach 中的断言。
$httpBackend的expect()
语法非常严格,你可能更喜欢使用when()
语法,更宽松也更"black box"。您可以阅读 angularJS documentation for $httpBackend
中的一些差异
自从我尝试使用 $httpBackend.verifyNoOustandingRequest() 以来,我在通过一些测试时遇到了问题。
如果我不在我的 afterEach 函数中包含它,那么测试会通过,但是当我这样做时,除了最后一个 'should load items from the server' 之外,我的所有测试都会失败。每个失败的测试响应与最后一个测试相差 'Error: unflushed request: 1'。
我不明白的是,我认为您只需要担心 flush 是在模拟 ajax 请求时,但它除了我的实际服务器测试外都失败了。
如有任何帮助,我们将不胜感激。
describe('controller: ListCtrl', function(){
beforeEach(module('notesApp'));
var ctrl, loc, mockService, itemServiceS, mockBackend;
beforeEach(inject(function($controller, $location, ItemService, $httpBackend){
spyOn(ItemService, 'list').and.returnValue([{id: 1, label: 'First', done: true}]);
itemService = ItemService;
mockBackend = $httpBackend;
mockBackend.expectGET('/api/note').respond([{id: 1, label: 'Mock'}]);
ctrl = $controller('ListCtrl');
loc = $location;
}));
it('Should have items available on load', function(){
expect(ctrl.items).toEqual([
{id: 1, label: 'First', done: true},
{id: 2, label: 'Second', done: false}
]);
});
it('Should have highlight items based on state', function(){
var item = {id: 1, label: 'First', done: true};
var actualClass = ctrl.getDoneClass(item);
expect(actualClass.finished).toBeTruthy();
expect(actualClass.unfinished).toBeFalsy();
item.done = false;
actualClass = ctrl.getDoneClass(item);
expect(actualClass.finished).toBeFalsy();
expect(actualClass.unfinished).toBeTruthy()
});
it('should change the url', function(){
expect(loc.path()).toEqual('');
ctrl.navigate1();
expect(loc.path()).toEqual('/some/where/else');
});
it('Should change the url to /some/where', function(){
expect(loc.path()).toEqual('');
ctrl.navigate2();
expect(loc.path()).toEqual('/some/where');
});
it('Should have called through ItemService factory', function(){
expect(itemService.list).toHaveBeenCalled();
expect(itemService.list.calls.count()).toEqual(1);
expect(ctrl.itemsGet).toEqual([{id: 1, label: 'First', done: true}]);
});
it('Should load items from server', function(){
expect(ctrl.retrievedItems).toEqual([]);
mockBackend.flush();
expect(ctrl.retrievedItems.data).toEqual([{id: 1, label: 'Mock'}]);
});
afterEach(function(){
mockBackend.verifyNoOutstandingExpectation();
mockBackend.verifyNoOutstandingRequest();
})
});
没有看到您的控制器代码我不能确定,但模拟 API 请求似乎是控制器初始化的一部分。因此,总是会发出请求,并且必须始终刷新它以满足 afterEach 中的断言。
$httpBackend的expect()
语法非常严格,你可能更喜欢使用when()
语法,更宽松也更"black box"。您可以阅读 angularJS documentation for $httpBackend