我开始为现有应用程序编写测试并遇到两个问题。
以下是服务方法I试图涵盖:
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
实际上,我确实在app load
上调用了以下路径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期望放入每个服务测试工具包的情况下避免出现这两个错误?
答案 0 :(得分:3)
$httpBackend.flush();
是坏人。
它将触发$ routeProvider将拦截并执行的广播。
一种解决方案是使用return false
$httpBackend.when('GET', '/dashboard').respond(false);
答案 1 :(得分:0)
我的问题是我整个应用程序都有一个模块,现在我明白这是完全错误的。我将我的应用程序拆分为不同的模块,当我为特定组件编写测试时,不需要上传整个应用程序,只需要上传组件所属的模块。我将应用程序.run
和routeProvider
配置删除到独立模块中,因此在我测试嵌套组件时无需上传新的配置模块。