AngularJS + Jasmine:意外的 http 调用
AngularJS + Jasmine: Unexpected http calls
我开始为现有应用程序编写测试并遇到两个问题。
这是我要介绍的服务方法:
function getClinic(id) {
return $http
.get("api/clinic/" + id)
.then(function (resp) {
return resp.data;
})
}
与
it('should test getClinic method http call', function() {
$httpBackend
.expectGET("api/clinic/" + clinicId)
.respond(200, $q.when(successResponse));
clinicManager.getClinic(clinicId)
.then(function(res) {
httpOutput = res;
});
$httpBackend.flush();
expect(clinicManager.getClinic).toHaveBeenCalledWith(clinicId);
expect(httpOutput).toEqual(successResponse);
});
但是我得到以下错误
Error: Unexpected request: GET /api/users/current
确实,我确实在应用加载时调用了以下路由
angular
.module('module', [...])
.config(...)
.run(function (userManager) {
userManager.setCurrentUser();
// I put this logic here to fetch currently logged user from back-end on every app load
})
删除后 userManager.setCurrentUser();
我又遇到了一个错误
Error: Unexpected request: GET /dashboard
所以 /dashboard
是在 $routeProvider
中指定的初始页面
function Routes($routeProvider) {
$routeProvider
.when('/', {
templateUrl: '/dashboard',
controller: 'dashboard.ctrl',
})
.when('/dashboard', {
templateUrl: '/dashboard',
controller: 'dashboard.ctrl',
})
//... other routes
.otherwise({
redirectTo: '/dashboard',
});
所以我的问题是,如果不将 http 期望放入每个服务测试工具包中,我如何才能避免出现这两个错误?
$httpBackend.flush();
是这里的坏人。
它将触发一个广播,$routeProvider 将拦截该广播并对其进行操作。
一种解决方案是使用 return false
模拟该调用
$httpBackend.when('GET', '/dashboard').respond(false);
我的问题是整个应用程序只有一个模块,现在我明白这是完全错误的。我将我的应用程序拆分为不同的模块,当我为特定组件编写测试时,无需上传整个应用程序,只需上传该组件所属的模块。我将应用程序 .run
和 routeProvider
配置删除到独立模块中,因此在测试嵌套组件时无需上传新配置模块。
我开始为现有应用程序编写测试并遇到两个问题。
这是我要介绍的服务方法:
function getClinic(id) {
return $http
.get("api/clinic/" + id)
.then(function (resp) {
return resp.data;
})
}
与
it('should test getClinic method http call', function() {
$httpBackend
.expectGET("api/clinic/" + clinicId)
.respond(200, $q.when(successResponse));
clinicManager.getClinic(clinicId)
.then(function(res) {
httpOutput = res;
});
$httpBackend.flush();
expect(clinicManager.getClinic).toHaveBeenCalledWith(clinicId);
expect(httpOutput).toEqual(successResponse);
});
但是我得到以下错误
Error: Unexpected request: GET /api/users/current
确实,我确实在应用加载时调用了以下路由
angular
.module('module', [...])
.config(...)
.run(function (userManager) {
userManager.setCurrentUser();
// I put this logic here to fetch currently logged user from back-end on every app load
})
删除后 userManager.setCurrentUser();
我又遇到了一个错误
Error: Unexpected request: GET /dashboard
所以 /dashboard
是在 $routeProvider
function Routes($routeProvider) {
$routeProvider
.when('/', {
templateUrl: '/dashboard',
controller: 'dashboard.ctrl',
})
.when('/dashboard', {
templateUrl: '/dashboard',
controller: 'dashboard.ctrl',
})
//... other routes
.otherwise({
redirectTo: '/dashboard',
});
所以我的问题是,如果不将 http 期望放入每个服务测试工具包中,我如何才能避免出现这两个错误?
$httpBackend.flush();
是这里的坏人。
它将触发一个广播,$routeProvider 将拦截该广播并对其进行操作。
一种解决方案是使用 return false
$httpBackend.when('GET', '/dashboard').respond(false);
我的问题是整个应用程序只有一个模块,现在我明白这是完全错误的。我将我的应用程序拆分为不同的模块,当我为特定组件编写测试时,无需上传整个应用程序,只需上传该组件所属的模块。我将应用程序 .run
和 routeProvider
配置删除到独立模块中,因此在测试嵌套组件时无需上传新配置模块。