Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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
使用Jasmine模拟AngularJS XHR测试请求_Angularjs_Xmlhttprequest_Jasmine - Fatal编程技术网

使用Jasmine模拟AngularJS XHR测试请求

使用Jasmine模拟AngularJS XHR测试请求,angularjs,xmlhttprequest,jasmine,Angularjs,Xmlhttprequest,Jasmine,好吧,我很确定这是一种非常奇怪的行为——我不知道发生了什么 代码如下 我在可能是有史以来最简单的AngularJS控制器上运行Jasmine规范,它在初始化时调用函数(getSuppliers),然后发出http get请求,我使用$httpBackend模拟了该请求。当我实际运行测试时,就会出现这种奇怪的情况。它失败,因为预期未定义为等于“供应商列表” 所以我陷入了一些调试器s(1和2),并在Chrome中运行规范。这是奇怪的部分。调试器2在调试器1之前被命中,这意味着getSuppliers

好吧,我很确定这是一种非常奇怪的行为——我不知道发生了什么

代码如下

我在可能是有史以来最简单的AngularJS控制器上运行Jasmine规范,它在初始化时调用函数(getSuppliers),然后发出http get请求,我使用$httpBackend模拟了该请求。当我实际运行测试时,就会出现这种奇怪的情况。它失败,因为
预期未定义为等于“供应商列表”

所以我陷入了一些
调试器s(1和2),并在Chrome中运行规范。这是奇怪的部分。调试器2在调试器1之前被命中,这意味着getSuppliers函数返回值
undefined
,而mock甚至还没来得及发挥作用。作为记录,当我继续并让debugger 1也出现时,数据具有正确的值
“供应商列表”
,因此如果我能让mock在正确的位置运行,我会很高兴。有人知道这到底是怎么回事吗

规格js

describe("Supplier Controller", function(){
    ctrl = null;
    scope = null;
    httpBackend = null;
    supplierController = null;

    beforeEach(inject(function($controller,$rootScope,$httpBackend) {
        scope = $rootScope.$new();
        ctrl = $controller;
        httpBackend = $httpBackend;

        httpBackend.expectGET('/suppliers.json').respond("list of suppliers");
        supplierController = ctrl('supplierCtrl', { $scope: scope});
        $httpBackend.flush();
    }));

    it("gets a list of suppliers", function(){
        expect(scope.suppliers).toEqual( "list of suppliers" );
    });
});
supplier.js

function supplierCtrl($scope, $http) {
    $scope.suppliers = getSuppliers($http);
}

function getSuppliers($http){
    var suppliers;
    $http.get('/suppliers.json').success(function(data) {
        debugger; // Debugger 1
        suppliers = data;
    }).error(function(){ suppliers = "something else"; } );
    debugger; // Debugger 2
    return suppliers;
};

感谢您的智慧…

debugger 2可能在debugger 1之前被命中,因为$http返回一个承诺。这意味着脚本没有被成功回调阻止,而是继续执行。我想你可能是对的。通过直接在http get请求中设置
$scope.suppliers
的值(即
$scope.suppliers=data;
不会获得任何奇怪的行为)。