我的应用中的单元测试问题

时间:2015-05-06 20:32:11

标签: javascript angularjs unit-testing jasmine

我遇到了在我的情况下加载$ resource对象的问题。

我在父控制器中有一些东西,比如

$scope.data = Product.$query();

然后在子控制器中,我有

$scope.data.$promise.then(function(product){
     console.log(data);
})

我的工厂

angular.module('testApp').factory('Product', ['$resource', function ($resource) {
    return $resource('/api/product');
}]);

我将Product.$query()放在父控制器中的原因是因为我希望它被共享并在不同的子控制器中使用。

我的测试文件如下

describe('Product test ', function () {
    var $httpBackend, childCtrl,  scope;

    beforeEach(module('testApp', function($provide) {
        $provide.value('$log', console);
    }));

    beforeEach(inject(function (_$controller_, _$httpBackend_, _$rootScope_) {
        scope = _$rootScope_.$new();
        $rootScope = _$rootScope_;
        $httpBackend = _$httpBackend_;

        childCtrl = _$controller_('childCtrl', {
            $scope: scope
        });
    }));

    describe('some test', function() {
        it('some test here', function(){
             //codes...
        })
    })
});

当我进行测试时,我正在

TypeError: 'undefined' is not an object (evaluating '$scope.data.$promise')

我不确定这里发生了什么。有人可以帮我吗?非常感谢

1 个答案:

答案 0 :(得分:1)

当我要在茉莉花中测试$resource对象时,您需要创建$httpBackend模拟响应,当您向$resource查询时,该响应将不会返回直接使用`$ resource。

describe('Product test ', function () {
    var $httpBackend, childCtrl,  scope, Product;

    beforeEach(module('testApp', function($provide) {
        $provide.value('$log', console);
    }));

    beforeEach(inject(function (_$controller_, _$httpBackend_, _$rootScope_, Product) {
        scope = _$rootScope_.$new();
        $rootScope = _$rootScope_;
        $httpBackend = _$httpBackend_;
        Product = Product;

        childCtrl = _$controller_('childCtrl', {
            $scope: scope,
            Product: Product
        });
    }));

    describe('some test', function() {
        it('some test here', function(){
             $httpBackend.expect('GET', '/api/product').respond([{ id: 1, name: 'a' }, { id: 2, name: 'b' }]);
             childCtrl.data = Product.query();
                 expect(childCtrl.projects).toEqualData([]);
                 $httpBackend.flush(); //flushing $httpBackend
                 expect(childCtrl.data).toEqualData([{ id: 1, name: 'a' }, { id: 2, name: 'b' }]);
        })
    })
});

有关详细信息,请参阅this link