所有我的UNIT测试,而不是E2E测试,使用显式rootScope.digest()或httpBackend.flush()来刷新异步回调,遇到错误:
How to avoid the 'Error: Unexpected request: GET'
No more request expected
我认为这是因为httpBackend调用了ui-router模板。我不知道为什么要这样做。我不是要求这个。我只想让它调用我的模拟json服务。
这个错误迫使我在每个it()块中都有以下语句:
$httpBackend.whenGET(/\.html$/).respond('');
必须有一个更简洁的方式。
特别是如果测试首先没有使用$ httpBackend:
it('should return the list of searched users', function() {
// Always use this statement so as to avoid the error from the $http service making a request to the application main page
$httpBackend.whenGET(/\.html$/).respond('');
var users = null;
UserService.search('TOTO', 1, 10, 'asc', function(data) {
users = data.content;
});
$rootScope.$digest();
expect(users).toEqual(RESTService.allUsers.content);
});
测试通过,但看起来很乱。或者noobish: - )
编辑:另一项测试:
it('should return the list of users', function () {
// Always use this statement so as to avoid the error from the $http service making a request to the application main page
$httpBackend.whenGET(/\.html$/).respond('');
// Create a mock request and response
$httpBackend.expectGET(ENV.NITRO_PROJECT_REST_URL + '/users/1').respond(mockedUser);
// Exercise the service
var user = null;
RESTService.User.get({userId: 1}).$promise.then(function(data) {
user = data;
});
// Synchronise
$httpBackend.flush();
// Check for the callback data
expect(user.firstname).toEqual(mockedUser.firstname);
expect(user.lastname).toEqual(mockedUser.lastname);
});
答案 0 :(得分:2)
这显然是设计的,您的测试应该检查是否正在进行HTTP调用以及他们是否正在请求正确的URL。而不是检查是否向/\.html$/
发出请求,而不是检查是否请求正确端点?无论是部分指令还是API调用。
如果您坚持放弃可能有用的测试,可以将whenGET()
移至beforeEach()
。