angularjs - 在 AngularJS 应用程序中运行 Karma 单元测试时出现 "Unexpected request"错误

标签 angularjs unit-testing jasmine karma-runner httpbackend

我正在尝试为 Controller 编写一个单元测试,该 Controller 使用 $http 服务获取文章详细信息。

Controller :

 .controller('ArticleDetailCtrl',function($scope, Article, $routeParams, API_URL, ARTICLE_URL, $http, $sce){

    $scope.url = API_URL + ARTICLE_URL + '/' + $routeParams.articleId;

    $http.get($scope.url).then(function(response) {
        //console.log(response.data);
        $scope.heading = response.data.Headline;
        $scope.rawBody = response.data.Body;
        $scope.body = $sce.trustAsHtml($scope.rawBody);
        $scope.image = response.data.Assets[0].URL;
    });   
    });

单元测试:

'use strict';

describe('Controller: Article', function () {

    var scope,
        $httpBackend,
        articleEndpoint;



    // load the controller's module
    beforeEach(module('myApp'));


    describe('ArticleDetailCtrl', function () {

        var ArticleDetailCtrl,
            jsonObject,
            ArticleId = '123';

        // Initialize the controller and a mock scope
        beforeEach(inject(function ($controller, $rootScope, _$httpBackend_, Article, API_URL, ARTICLE_URL) {

            scope = $rootScope.$new();
            ArticleDetailCtrl = $controller('ArticleDetailCtrl', { $scope: scope });
            $httpBackend =  _$httpBackend_;
            articleEndpoint = API_URL + ARTICLE_URL + '/' + ArticleId;

            jsonObject = {
                'Headline': 'Headline',
                'Body': '<p>Body</p>',
                'Assets': [
                    {
                        'URL': 'path/to/image/article1.jpg'
                    }
                ]
            };

            $httpBackend.when('GET', articleEndpoint).respond(jsonObject);
        }));

        afterEach(function() {
            $httpBackend.verifyNoOutstandingExpectation();
            $httpBackend.verifyNoOutstandingRequest();
        });

        it('should fetch article details from the API', function () {
            //expect(scope.articles.length).toEqual(3);

            $httpBackend.expectGET(articleEndpoint);
            $httpBackend.flush();
        });

    });    

});

但我不断收到以下错误:

Error: Unexpected request: GET http://localhost:3000/api/articles/undefined
Expected GET http://localhost:3000/api/articles/123
    at $httpBackend (/Users/gill/Documents/projects/angularjs-test/app/bower_components/angular-mocks/angular-mocks.js:1179)
    at sendReq (/Users/gill/Documents/projects/angularjs-test/app/bower_components/angular/angular.js:8181)
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular/angular.js:7921
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular/angular.js:11319
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular/angular.js:11405
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular/angular.js:12412
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular/angular.js:12224
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular-mocks/angular-mocks.js:1438
    at /Users/gill/Documents/projects/angularjs-test/test/spec/controllers/article.js:77
Error: Unsatisfied requests: GET http://localhost:3000/api/articles/123
    at /Users/gill/Documents/projects/angularjs-test/app/bower_components/angular-mocks/angular-mocks.js:1472
    at /Users/gill/Documents/projects/angularjs-test/test/spec/controllers/article.js:65

这是我第一次编写单元测试,我随后阅读了一些教程。我不知道我做错了什么?

最佳答案

您的问题很简单,但很常见。

当您编写 Jasmine/Karma 单元测试时,使用 $controller 服务几乎可以自动创建 Controller 。这意味着,在大多数情况下,您可以从单元测试中说

$controller('ArticleDetailCtrl')

AngularJS 将找出其依赖的服务,注入(inject)它们并创建一个 Controller 实例供您进行单元测试。

有一个异常(exception):

AngularJS does not know how to inject context specific services like $scope and $routeParams, which change based on the HTML structure and the URL for each instance of the controller.

我注意到在您的单元测试中您将 Controller 创建为

ArticleDetailCtrl = $controller('ArticleDetailCtrl', { $scope: 范围 });

此时,您告诉 AngularJS 当 Controller 请求 $scope 作为依赖服务时要使用哪个对象。但在你的 Controller 中,你还注入(inject)了 $routeParams。并根据其 articleId 创建请求的 URL。

因此,如果您将 Controller 实例化代码更改为:

ArticleDetailCtrl = $controller('ArticleDetailCtrl', { 
    $scope: scope, 
    $routeParams: articleId: ArticleId
});

现在应该创建正确的 URL(而不是使用未定义的articleId,这是错误)

请告诉我这是否有帮助。

关于angularjs - 在 AngularJS 应用程序中运行 Karma 单元测试时出现 "Unexpected request"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609316/

相关文章:

javascript - 使用 $httpBackend 捕获各种请求

javascript - 在 Angular 分页中切片 ng-repeat

node.js - 测试 then() block 内的代码

angular - 如何测试 Angular 2 Jasmine 中的模型类型

javascript - 如何在 AngularJS 项目中使用 swagger 生成 "javascript-closure-angular-client"

javascript - 按键时触发 AngularJS $scope 事件

c# - MassTransit 消费者测试已通过,但引发了令人困惑的错误

unit-testing - 我如何在Dart中的then语句中进行测试

maven - 无法使用 karma、jasmine、phantomjs 和 maven 加载 angular.js 进行单元测试

angular - 我如何使用 ngRedux 测试服务