Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Karma Jasmine:意外请求:获取。。。不需要更多的请求_Javascript_Angularjs_Unit Testing_Karma Runner_Karma Jasmine - Fatal编程技术网

Javascript Karma Jasmine:意外请求:获取。。。不需要更多的请求

Javascript Karma Jasmine:意外请求:获取。。。不需要更多的请求,javascript,angularjs,unit-testing,karma-runner,karma-jasmine,Javascript,Angularjs,Unit Testing,Karma Runner,Karma Jasmine,情况: .controller('TestController', function($scope, $http, $timeout) { $scope.getLanguageList = function() { $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) { $scope.language_list = resp.data;

情况:

.controller('TestController', function($scope, $http, $timeout) {

    $scope.getLanguageList = function()
    {
        $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) 
        {
            $scope.language_list = resp.data;
        }, 
        function(err) 
        {
            $scope.language_list = [];
        })
    }

    $scope.language_list = [];
    $scope.getLanguageList();


    $scope.get_project_list = function()
    {
        $http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp) 
        {
            $scope.project_list = resp.data;
        }, 
        function(err) 
        {
            $scope.project_list = [];
        })
    }

    $scope.project_list = [];
    $scope.get_project_list();

})
describe('Http requests tests', function() {

beforeEach(module('my_app.controllers'));

var $controller;
var $httpBackend;
var $scope;
var $timeout;


describe('Lists test', function() 
{

    beforeEach(angular.mock.http.init);
    afterEach(angular.mock.http.reset);

    beforeEach(inject(function(_$controller_, _$httpBackend_) 
    {
        $controller = _$controller_;
        $scope = {};
        $httpBackend = _$httpBackend_;

    }));


    it('should load default language list', function (done) 
    {
        $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.language_list).not.toEqual([]);
            done();
        }, 1000);

    });


    it('should load default project list', function (done) 
    {
        $httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.project_list).not.toEqual([]);
            done();
        }, 1000);

    });

});

});
我正在AngularJs应用程序中测试两个不同的http调用

有一种奇怪的行为。如果我单独测试每一个,并且另一个临时注释掉(在控制器和测试中),那么每个都可以正常工作,并且测试通过

但如果我在两个测试都存在的情况下运行karma,它们就会失败,并给出以下错误消息:

Unexpected request: GET https://MY_DOMAIN_2.com/list_project
No more request expected
控制器:

.controller('TestController', function($scope, $http, $timeout) {

    $scope.getLanguageList = function()
    {
        $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) 
        {
            $scope.language_list = resp.data;
        }, 
        function(err) 
        {
            $scope.language_list = [];
        })
    }

    $scope.language_list = [];
    $scope.getLanguageList();


    $scope.get_project_list = function()
    {
        $http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp) 
        {
            $scope.project_list = resp.data;
        }, 
        function(err) 
        {
            $scope.project_list = [];
        })
    }

    $scope.project_list = [];
    $scope.get_project_list();

})
describe('Http requests tests', function() {

beforeEach(module('my_app.controllers'));

var $controller;
var $httpBackend;
var $scope;
var $timeout;


describe('Lists test', function() 
{

    beforeEach(angular.mock.http.init);
    afterEach(angular.mock.http.reset);

    beforeEach(inject(function(_$controller_, _$httpBackend_) 
    {
        $controller = _$controller_;
        $scope = {};
        $httpBackend = _$httpBackend_;

    }));


    it('should load default language list', function (done) 
    {
        $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.language_list).not.toEqual([]);
            done();
        }, 1000);

    });


    it('should load default project list', function (done) 
    {
        $httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.project_list).not.toEqual([]);
            done();
        }, 1000);

    });

});

});
测试:

.controller('TestController', function($scope, $http, $timeout) {

    $scope.getLanguageList = function()
    {
        $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) 
        {
            $scope.language_list = resp.data;
        }, 
        function(err) 
        {
            $scope.language_list = [];
        })
    }

    $scope.language_list = [];
    $scope.getLanguageList();


    $scope.get_project_list = function()
    {
        $http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp) 
        {
            $scope.project_list = resp.data;
        }, 
        function(err) 
        {
            $scope.project_list = [];
        })
    }

    $scope.project_list = [];
    $scope.get_project_list();

})
describe('Http requests tests', function() {

beforeEach(module('my_app.controllers'));

var $controller;
var $httpBackend;
var $scope;
var $timeout;


describe('Lists test', function() 
{

    beforeEach(angular.mock.http.init);
    afterEach(angular.mock.http.reset);

    beforeEach(inject(function(_$controller_, _$httpBackend_) 
    {
        $controller = _$controller_;
        $scope = {};
        $httpBackend = _$httpBackend_;

    }));


    it('should load default language list', function (done) 
    {
        $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.language_list).not.toEqual([]);
            done();
        }, 1000);

    });


    it('should load default project list', function (done) 
    {
        $httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.project_list).not.toEqual([]);
            done();
        }, 1000);

    });

});

});
问题:

.controller('TestController', function($scope, $http, $timeout) {

    $scope.getLanguageList = function()
    {
        $http.get('http://MY_DOMAIN_1.org/languageList').then(function(resp) 
        {
            $scope.language_list = resp.data;
        }, 
        function(err) 
        {
            $scope.language_list = [];
        })
    }

    $scope.language_list = [];
    $scope.getLanguageList();


    $scope.get_project_list = function()
    {
        $http.get('https://MY_DOMAIN_2.com/projectList').then(function(resp) 
        {
            $scope.project_list = resp.data;
        }, 
        function(err) 
        {
            $scope.project_list = [];
        })
    }

    $scope.project_list = [];
    $scope.get_project_list();

})
describe('Http requests tests', function() {

beforeEach(module('my_app.controllers'));

var $controller;
var $httpBackend;
var $scope;
var $timeout;


describe('Lists test', function() 
{

    beforeEach(angular.mock.http.init);
    afterEach(angular.mock.http.reset);

    beforeEach(inject(function(_$controller_, _$httpBackend_) 
    {
        $controller = _$controller_;
        $scope = {};
        $httpBackend = _$httpBackend_;

    }));


    it('should load default language list', function (done) 
    {
        $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.language_list).not.toEqual([]);
            done();
        }, 1000);

    });


    it('should load default project list', function (done) 
    {
        $httpBackend.whenGET('https://MY_DOMAIN_2.org/projectList').passThrough();

        var TestController = $controller('TestController', { $scope: $scope });

        setTimeout(function() 
        {
            expect($scope.project_list).not.toEqual([]);
            done();
        }, 1000);

    });

});

});
为什么我会收到那个错误消息? 代码应该很好,因为它们单独工作时很好。我错过什么了吗


谢谢大家!

不要使用超时,同时测试它们:

it('should load default language list and the default project list', function (){
    $httpBackend.whenGET('http://MY_DOMAIN_1.org/languageList').passThrough();
    $httpBackend.whenGET('httpS://MY_DOMAIN_2.org/projectList').passThrough();

    var TestController = $controller('TestController', { $scope: $scope });

    $httpBackend.flush();

    expect($scope.language_list).not.toEqual([]);
    expect($scope.project_list).not.toEqual([]);
});

这里有一些提示和演示

  • 您应该使用
    $httpBackend.flush()
    ,而不是
    setTimeout()
    。通过这种方式,您可以控制异步请求何时返回。它使测试更容易

  • 将$httpBackend和控制器拉出到beforeach语句中。创建控制器时,它会同时触发两个url。然后你可以单独评估它。当它在
    it
    语句中被隔离时,它不会调用另一个$http并抛出意外的url错误

  • 您还应该模拟$http请求的响应,而不是传递。您并不总是能够连接到internet,并且响应可能会发生变化。因此,让模拟数据看起来像您期望的那样

  • 此外,
    $httpBackend.whenGET('httpS://MY\u DOMAIN\u 2.org/projectList')
    请求的url不正确。它应该是小写的
    s
    .com
    url。这是因为控制器正在请求

    $http.get(“”)


如果您将$scope={}更改为$scope=$rootScope.$new()?已尝试,但没有任何更改。感谢您的回复。我已经尝试过了,但是我现在遇到了这个错误:没有等待刷新的请求!但是按照你的建议,在一个独特的测试中团结起来是可行的!但只使用超时。。为什么冲洗不能正常工作?为什么要作为一个单独的测试工作,而不是作为两个单独的测试工作?非常感谢你!对于解决方案和清晰的解释。关于最后一点,S的大写字母是一个拼写错误,但是为什么应该是.com而不是.org?顺便说一句,我相信您知道答案:它应该是
.com
,因为您在控制器中调用了
.com
<代码>$http.get('https://MY_DOMAIN_2.com/projectList)。然后(函数(resp)