【发布时间】:2014-11-05 19:39:23
【问题描述】:
这是我以前的问题的扩展:$httpBackend in AngularJs Jasmine unit test
在我的控制器中,getStuff 函数在启动时被调用。这导致我的单元测试失败。当我将其注释掉时,我的单元测试通过并成功运行。取消注释时,错误为:
错误:意外请求:GET /api/stuff 预计不再有请求
我的控制器是:
$scope.stuff = [];
$scope.getStuff = function () {
var url = site.root + 'api/stuff';
$http.get(url)
.success(function (data) {
$scope.stuff = data;
})
.error(function(error) {
console.log(error);
});
};
//$scope.getStuff();
我的单元测试是:
it('should get stuff', function () {
var url = '/api/stuff';
var httpResponse = [{ "stuffId": 1 }, { "stuffId": 2 }];
httpLocalBackend.expectGET(url).respond(200, httpResponse);
$scope.getStuff();
httpLocalBackend.flush();
expect($scope.stuff.length).toBe(2);
} );
所有单元测试都是明智的,像这样工作得很好。不幸的是,这破坏了实际的站点功能。当我取消注释控制器的最后一行时,单元测试会中断,并且站点可以正常工作。任何帮助表示赞赏。谢谢!
已修复:感谢 fiskers7 的回答,这是我的解决方案。
it('should get stuff', function () {
var url = '/api/stuff';
var httpResponse = [{ "stuffId": 1 }, { "stuffId": 2 }];
httpLocalBackend.expectGET(url).respond(200, httpResponse);
httpLocalBackend.expectGET(url).respond(200, httpResponse);
$scope.getStuff();
httpLocalBackend.flush();
expect($scope.stuff.length).toBe(2);
} );
【问题讨论】:
-
当您创建控制器时,它会调用“api/stuff”,当您在测试中调用 $scope.getStuff() 时,您会再次调用它。因此,不是一次调用“api/stuff”,而是两次调用,这就是错误所说的。 httpBackend 没想到对端点的两次调用,只有一次,所以它抛出了错误。
-
@fiskers7 Wowwww .....你是对的。我添加了第二个“httpLocalBackend.expectGET(url).respond(200, httpResponse);”就在第一个之后,它修复了它。这对我的测试来说已经足够了,希望这对其他人也有帮助。如果您将此作为答案发布,我会接受。
标签: javascript angularjs unit-testing jasmine