【问题标题】:Unit test failing when function called on startup启动时调用函数时单元测试失败
【发布时间】: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


【解决方案1】:

我的评论逐字逐句:

当您创建控制器时,它会调用“api/stuff”,当您在测试中调用 $scope.getStuff() 时,您会再次调用它。因此,不是一次调用“api/stuff”,而是两次调用,这就是错误所说的。 httpBackend 没想到对端点的两次调用,只有一次,所以它抛出了错误。

如果您需要查看,我对这个答案的评论中的代码示例。

it('should get stuff', function () {
  var url = '/api/stuff';
  var httpResponse = [{ "stuffId": 1 }, { "stuffId": 2 }];
  httpLocalBackend.expectGET(url).respond(200, httpResponse);
  httpLocalBackend.flush();
  expect($scope.stuff.length).toBe(2); 
});

【讨论】:

  • 没问题。只需对您的测试进行更多评论,您实际上可以删除调用 $scope.getStuff() 并删除额外的 expectGET 调用,测试也将通过。只是取决于你喜欢如何测试,因为控制器在 init 上调用 getStuff 你不需要再次调用它,只需对其进行断言。
猜你喜欢
  • 2011-05-22
  • 1970-01-01
  • 2017-10-12
  • 2010-11-28
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多