业力测试 Angular 控制器

Karma testing Angular Controller

我已经开始学习如何在控制器上正确测试并遇到以下脚本。

http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-karma.html

it('should have a properly working VideosCtrl controller', inject(function($rootScope, $controller, $httpBackend) {
    var searchTestAtr = 'cars';
    var response = $httpBackend.expectJSONP(
      'https://gdata.youtube.com/feeds/api/videos?q=' + searchTestAtr + '&v=2&alt=json&callback=JSON_CALLBACK');
    response.respond(null);

    var $scope = $rootScope.$new();
    var ctrl = $controller('VideosCtrl', {
      $scope : $scope,
      $routeParams : {
        q : searchTestAtr
      }
    });
  }));

我有点困惑...expectedJSON 在以下 API 页面中:

https://docs.angularjs.org/api/ngMock/service/$httpBackend

我很困惑只是想知道这里测试的是什么,我可以看到那里的描述但仍然丢失...这里有什么预期?

与任何单元测试一样,您安排行动然后断言。

对于上面的测试,arrange 和 act 部分是不言自明的,但 assert 部分可能不明显。测试只是验证创建控制器时是否发送了搜索请求。

如果您查看视频控制器的控制器代码

 $youtube.query($scope.q, true, function(q, videos) {
      $scope.videos = videos;
      $scope.onReady();
    });

这可以确认。

断言部分由$httpBackend.expectJSONP完成。此设置告诉 karma 验证是否向特定 url 发出了 GET 请求。这里的 url 是 google 搜索 api,搜索词 cars

该测试基本上设置了一个模拟后端并断言它已被调用。

此测试没有明确的断言,但如果构建控制器实例因任何原因抛出异常,它将失败。

请记住,如果断言失败,它会抛出异常。像这样 运行 测试 运行 测试函数:

 try {
     runTest();
 } catch (e) {
     markTestFailed(e);
 }

因此,如果您的测试代码因任何原因抛出异常,测试将失败。