【发布时间】:2023-04-02 09:25:02
【问题描述】:
我认为我做所有事情的方式都与教程中的相同,并且存在奇怪的错误。我想在我的 LoginService 中模拟 $http 并对其进行测试。不幸的是,有一些问题 - 看起来它没有看到 $httpBackend 函数。这是我的登录服务:
app.factory('LoginService', function($http) {
//..
var validateUser = function(username, password){
$http.post('http://domain/api/login',
{
username: username,
password: password
})
.success(function (data) {
//...
});
};
return {
validateUser: validateUser,
getLoginState: getLoginState
};
});
还有针对 validateUser 函数的测试:
describe('LoginService', function() {
var httpBackend, LoginService;
beforeEach(module('app'));
beforeEach(inject(function ($httpBackend, _LoginService_) {
LoginService = _LoginService_;
httpBackend = $httpBackend;
}));
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('changes loginState object when user exists', inject(function(){
data = {username: "ut_user", token: "123456"};
httpBackend.expectPOST('http://domain/api/login').respond(data);
LoginService.validateUser("user", "pass");
httpBackend.flush();
expect(LoginService.getLoginState().loggedIn).toBe(true);
}));
});
并且在 httpBackend.verifyNoOutstandingExpectation(); 上有错误之前在 httpBackend.flush() 上:
ReferenceError: $ is not defined
at http://localhost:9876/base/js/routes.js:21:34
at Scope.$broadcast (http://localhost:9876/base/node_modules/angular/angular.js:16200:28)
at http://localhost:9876/base/node_modules/angular/angular.js:12231:45
at Scope.$eval (http://localhost:9876/base/node_modules/angular/angular.js:15878:28)
at Scope.$digest (http://localhost:9876/base/node_modules/angular/angular.js:15689:31)
at Function.$httpBackend.verifyNoOutstandingExpectation (http://localhost:9876/base/node_modules/angular-mocks/angular-mocks.js:1563:38)
at Object.<anonymous> (http://localhost:9876/base/spec/services/loginServiceSpec.js:11:21)
at attemptSync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1789:24)
at QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1777:9)
at QueueRunner.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1762:10)
我有 karma conf:
files: [
'node_modules/angular/angular.js',
'node_modules/angular-*/angular-*.js',
'js/**/*.js',
'spec/**/*.js'
],
【问题讨论】:
-
显示完整的堆栈跟踪。
-
因此,您的 routes.js 文件在第 21 行使用了一个名为
$的变量,该变量未定义。如果您使用 jQuery,则将其添加到 karma 配置中的文件列表中。 -
哦,伙计,我认为它与 $httpBackend 中的 $ 相关联 :D 非常感谢。下次我会更准确地查看stacktrace
标签: angularjs http testing jasmine httpbackend