我已经开始学习如何在控制器上正确测试并遇到以下脚本。
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
我很困惑只是想知道在这里测试了什么,我可以看到那里的描述,但仍然失去了......这里的预期是什么?
答案 0 :(得分:2)
与任何单元测试一样,您安排行为然后断言。
对于上述测试,排列和行为的部分是不言而喻的,但断言部分可能并不明显。测试只是验证在创建控制器时是否发送了搜索请求。
如果查看视频控制器的控制器代码
$youtube.query($scope.q, true, function(q, videos) {
$scope.videos = videos;
$scope.onReady();
});
这可以确认。
断言部分由$httpBackend.expectJSONP
完成。此设置告诉karma验证是否对特定URL进行了GET请求。这里的网址是搜索字词为cars
的Google搜索API。
该测试基本上设置了一个模拟后端并断言它被调用。
答案 1 :(得分:2)
此测试没有明确的断言,但如果构造控制器实例因任何原因抛出异常,它将失败。
请记住,如果断言失败,则会抛出异常。测试跑步者只需运行您的测试功能:
try {
runTest();
} catch (e) {
markTestFailed(e);
}
因此,如果您的测试代码因任何原因抛出异常,则测试将失败。