Karma error: unknown provider
Karma error: unknown provider
我们正在尝试使用 Karma 测试我们的控制器,但 Karma 一直抱怨未知提供商:
Error: [$injector:unpr]
Unknown provider: userProvider
<- user
我们是否正确注入 user
?
我们的代码:
控制器-test.js:
describe('Controller', function () {
beforeEach(module('myApp'));
var ctrl, scope, user;
beforeEach(inject(function ($controller, $rootScope, _user_) {
scope = $rootScope.$new();
ctrl = $controller('controller', {
$scope: scope
});
user = _user_;
}));
it("should have scope defined", function () {
expect(scope).toBeDefined();
});
});
app.js:
(function () {
var myApplication = angular.module("myApp", [
"angucomplete-alt"
]);
fetchData().then(bootstrapApplication);
function fetchData() {
var initInjector = angular.injector(["ng"]);
var $http = initInjector.get("$http");
// Get user info before app is loaded
return $http.get('/api/user').then(function (response) {
myApplication.value("user", response.data);
}, function (errorResponse) {
// Handle error case
console.error("Obtaining user information failed when bootstrapping Angular app");
});
}
function bootstrapApplication() {
angular.element(document).ready(function () {
angular.bootstrap(document, ["myApp"]);
});
}
})();
controller.js:
angular.module("myApp")
.controller("controller", ["$scope", "user", "$window",
function ($scope, user, $window) { ... }]);
测试您的控制器时,您应该单独进行。我会简单地将模拟的 user
对象放入 locals hashmap(连同 $scope
),例如
describe('Controller', function() {
var ctrl, scope, user, $window;
beforeEach(function() {
user = {
id: 'fake_id',
username: 'fake_username'
};
$window = jasmine.createSpyObj('$window', ['some', 'methods']);
module('myApp');
inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('controller', {
$scope: scope,
user: user,
$window: $window
});
});
});
});
示例规范可能是测试注入的 user
对象是否放置在范围内。例如
it('puts the user onto the controller scope', function() {
expect(scope.user).toBe(user);
});
在 ngMock
到位的单元测试中(我假设你有),所有 $http
调用都会通过不执行真正 HTTP 调用的模拟后端 ($httpBackend
)除非专门配置为这样做。
即使您的 fetchData
函数在测试时 运行(我怀疑它没有做其他事情,您会收到一些控制台错误),它也不会检索任何数据。
我们正在尝试使用 Karma 测试我们的控制器,但 Karma 一直抱怨未知提供商:
Error:
[$injector:unpr]
Unknown provider:userProvider
<-user
我们是否正确注入 user
?
我们的代码:
控制器-test.js:
describe('Controller', function () {
beforeEach(module('myApp'));
var ctrl, scope, user;
beforeEach(inject(function ($controller, $rootScope, _user_) {
scope = $rootScope.$new();
ctrl = $controller('controller', {
$scope: scope
});
user = _user_;
}));
it("should have scope defined", function () {
expect(scope).toBeDefined();
});
});
app.js:
(function () {
var myApplication = angular.module("myApp", [
"angucomplete-alt"
]);
fetchData().then(bootstrapApplication);
function fetchData() {
var initInjector = angular.injector(["ng"]);
var $http = initInjector.get("$http");
// Get user info before app is loaded
return $http.get('/api/user').then(function (response) {
myApplication.value("user", response.data);
}, function (errorResponse) {
// Handle error case
console.error("Obtaining user information failed when bootstrapping Angular app");
});
}
function bootstrapApplication() {
angular.element(document).ready(function () {
angular.bootstrap(document, ["myApp"]);
});
}
})();
controller.js:
angular.module("myApp")
.controller("controller", ["$scope", "user", "$window",
function ($scope, user, $window) { ... }]);
测试您的控制器时,您应该单独进行。我会简单地将模拟的 user
对象放入 locals hashmap(连同 $scope
),例如
describe('Controller', function() {
var ctrl, scope, user, $window;
beforeEach(function() {
user = {
id: 'fake_id',
username: 'fake_username'
};
$window = jasmine.createSpyObj('$window', ['some', 'methods']);
module('myApp');
inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('controller', {
$scope: scope,
user: user,
$window: $window
});
});
});
});
示例规范可能是测试注入的 user
对象是否放置在范围内。例如
it('puts the user onto the controller scope', function() {
expect(scope.user).toBe(user);
});
在 ngMock
到位的单元测试中(我假设你有),所有 $http
调用都会通过不执行真正 HTTP 调用的模拟后端 ($httpBackend
)除非专门配置为这样做。
即使您的 fetchData
函数在测试时 运行(我怀疑它没有做其他事情,您会收到一些控制台错误),它也不会检索任何数据。