Javascript 无法访问jasmine测试用例中的范围变量
我在模块中定义了一个控制器,如下所示Javascript 无法访问jasmine测试用例中的范围变量,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我在模块中定义了一个控制器,如下所示 myTestApp.controller("LoginController", function($scope,$http,$location) { $scope.submitForm = function(){ var userEmail = $scope.user.email; var userPassword = $scope.user.password; $http({ url:'api/login/'
myTestApp.controller("LoginController", function($scope,$http,$location) {
$scope.submitForm = function(){
var userEmail = $scope.user.email;
var userPassword = $scope.user.password;
$http({
url:'api/login/',
headers: {'Content-Type': 'application/json'},
method:'POST',
data:{
username:userEmail,
password:userPassword
}})
.success(function(data){
$scope.loginResult = data;
});
};
});
我正在尝试编写一个测试用例,使用httpBackend
模拟HTTP调用
这是我的jasmine
测试代码:
describe('make HTTP mock call', function() {
var scope, httpBackend, http, controller;
beforeEach(module('myTestApp'));
describe('with httpBackend', function() {
beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http) {
scope = $rootScope.$new();
httpBackend = $httpBackend;
http = $http;
controller = $controller('LoginController', {$scope : scope} );
httpBackend.when("POST", "api/login/",{'username':'test@gmail.com', 'password':'test'}, function(headers) {
return {
'Content-Type': 'application/json',
};
}).respond(200);
}));
afterEach(inject(function ($httpBackend){
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
}));
it('to check if user is valid', inject(function ($http) {
var expectedResponse = { success: true };
httpBackend.expectPOST('api/login/', {
"username": "test@gmail.com",
"password": "test"
}, function(headers){
return headers['Content-Type'] === 'application/json';
}).respond(function(method, url, data, headers, params){
return [200, {}, {}];
});
//actual HTTP call
$http({
url:'api/login/',
headers: {'Content-Type': 'application/json'},
method:'POST',
data:{
username:"test@gmail.com",
password:"test"
}});
//flush response
httpBackend.flush();
expect(scope.loginResult).toEqual(expectedResponse);
}));
});
}))
然而,当我运行测试用例时,我得到以下错误
应为未定义的相等对象({success:true})
我想将HTTP调用的响应数据与expectedResponse进行比较,如果两者相等,则测试应该通过
但是,我无法从测试用例中访问$scope
变量loginResult。谁能告诉我我做错了什么吗
有人能描述一下使用Jasmine模拟HTTP调用的最佳方法吗?只有在调用函数
submitForm
时,才会填充登录数据。因此,在测试中,在执行flush()
之前调用该函数
更新:
确保您已定义了
$scope.user={email :'test@gmail.com,password:'test'}
在测试的第一行(就在
it('to check user is valid',inject(function($http){
)hi之后,当我调用submitForm时,我得到了错误类型error:Cannot read undefined的属性'email',这是因为在你的作用域中,确保你已经定义了$scope.user={email:'test@gmail.com,密码:'test'}
在测试的第一行(就在it('检查用户是否有效')之后,注入(函数($http){
)。@ParthDoshi欢迎您将解决方案的第二部分添加到原始答案中