AngularJS和Jasmine测试控制器方法用$ http调用工厂方法

时间:2013-11-06 21:15:43

标签: angularjs controller tdd jasmine

我知道有很多类似的问题,但没有一个适用于同一场景 - 所以请不要将其标记为重复。

我正在试图弄清楚如何执行控制器方法的测试,该方法调用注入工厂服务的方法,执行$ http调用并返回json数组。

这就是我所拥有的:

angular.module('myApp', [])

.factory('callsFact', function($http) {

    var urlWrite = 'write.php';

    return {

        write : function(content) {

            return $http({
                method: 'POST',
                url: urlWrite,
                data: "content=" + content,
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            });

        }

      };

})

.controller('ReadWriteCtrl', function($scope, callsFact) {

    $scope.data = [];

    $scope.content = 'Some content';

    $scope.add = function() {

        callsFact.write($scope.content).success(function(data) {

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

        });

    };

});

现在,这是我参加测试的地方,因为我不太清楚该怎么做(请不要批评 - 我正在寻求帮助):

describe('ReadWriteCtrl tests', function() {

    var $scope,
        callsFact;



    beforeEach(function() {

        module('myApp');

        inject(function($rootScope, _callsFact_) {

            $scope = $rootScope.$new();
            callsFact = _callsFact_;

        });

    });


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

        $controller('ReadWriteCtrl', {

            $scope : $scope,
            callsFact : callsFact

        });


        $scope.data = [];

        $scope.content = 'Some message';

        $scope.add();

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


    }));

});

只是为了澄清 - 我正在试图弄清楚如何测试ReadWriteCtrl的add()方法。

1 个答案:

答案 0 :(得分:0)

因此,在这种情况下,您可以使用callsFact

的模拟版本
var mockPromise = {success: function(f){f({id:1})}};
var mockCallsFact = spyOn({}, 'add').andReturn(mockPromise);
$controller('ReadWriteCtrl', {

        $scope : $scope,
        callsFact : mockCallsFact

    });

然后你也可以包括断言:

expect(mockCallsFact.add).toHaveBeenCalled();

您也可以使用模拟`httpBackend',但我赞成以这种方式模拟依赖项。