AngularJS控制器单元在加载时使用$ http.get()进行测试

时间:2013-11-07 08:34:54

标签: unit-testing http angularjs jasmine

我很难理解如何解决测试控制器的单元问题,这会在初始化期间进行GET调用。

当测试执行POST请求的控制器方法时,由于初始GET调用,我在测试中遇到以下错误:

  

错误:意外请求:GET

控制器的主要部分如下所示:

.controller('someController', function($scope, $http, $log) {

    $scope.posts = [];

    $scope.content = '';

    $scope.read = function() {

        $http.get('/read.php')

            .success(function(data) {

                $scope.posts = data;

            })

            .error(function(data, status, headers, config) {

                throw new Error('Something went wrong with reading data');

            });

    };


    $scope.read();


    $scope.write = function() {

        $http({
            method: 'POST',
            url: '/write.php',
            data: "content=" + $scope.content,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        })
            .success(function(data) {

                $scope.posts.push({ id : data.id, task : $scope.content })

            })
            .error(function(data, status, headers, config) {

                throw new Error('Something went wrong with writing data');

            });

    };

});

正如您所看到的,我在定义后立即调用read()方法 - 以便在页面加载时从数据库中提取所有记录。

我已经尝试过.config()或其他服务了,但显然结果是一样的。

现在 - 我的测试如下:

describe('someController tests', function() {


    var $scope,
        $http,
        $httpBackend,
        $log;


     beforeEach(function() {

        module('myApp');

        inject(function($rootScope, _$http_, _$httpBackend_, _$log_) {

            $scope = $rootScope.$new();
            $http = _$http_;
            $httpBackend = _$httpBackend_;
            $log = _$log_;

        });


        $httpBackend.expectGET("/mod/read.php").respond({});


    });



    it('should add new record', inject(function($controller) {

        $controller('ToDoController', {

            $scope : $scope,
            $http : $http,
            $log : $log

        });


        $scope.posts = [];

        $scope.content = 'Some content';

        $httpBackend
            .whenPOST('/write.php')
            .respond({ id : 1, content : $scope.content });


        $scope.write();        

        $httpBackend.flush();     


        expect($scope.posts.length).toBe(1);


        afterEach(function() {

            $httpBackend.verifyNoOutstandingExpectation();
            $httpBackend.verifyNoOutstandingRequest();

        });

    }));



});

现在 - 我对这段代码有几个问题。

  1. 在页面加载中调用控制器内的方法是一种好习惯吗?我知道如果我在文档中使用ng-init来调用它 - 这可以解决我所有的问题,但我只是不喜欢这种方法。

  2. 在我正在调用的测试的beforeEach()方法中:

  3.   

    $ httpBackend.expectGET( “/ MOD / read.php”)作出响应({});

    反映初始化期间read()方法的调用,但是再次 - 我不确定这是正确的做法。我知道如果我删除它 - '应该添加新记录'测试将失败并出现上述错误。

    1. 我知道afterEach()应该放在it()块之外,但如果我这样做 - 它会导致同样的问题,但错误将适用于此描述块中的所有测试。把它放在it()块里面被认为是不好的做法/不正确吗?

    2. 如果在beforeEach()循环中已经触发了调用,我将如何执行read()测试?

    3. 最后 - 您的建议是改进/重写控制器和测试以确保其最佳效果?

    4. 我对TDD很陌生 - 所以我确信这只是我对这个主题的有限理解,但我会感激一些建设性的帮助。

0 个答案:

没有答案