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欢迎您将解决方案的第二部分添加到原始答案中