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