使用mock $ resource在AngularJS中进行单元测试

时间:2013-06-13 10:16:45

标签: javascript angularjs unit-testing jasmine karma-runner

尝试在AngularJS中使用一些单元测试(使用jasmine&amp; karma)工作并努力理解依赖注入......业力中的当前错误消息读取'错误:参数'fn'不是函数,得到字符串'< / p>

app.js

angular.module('App', [ 'App.Services', 'App.Controllers', 'App.Directives']);

controller.js

angular.module('App.Controllers', []).
controller('MarketplaceCtrl', function ($scope, apiCall) {
    apiCall.query({
        type: 'engagement',
        engagement_status__in: '0,1'
    }, function(data) {
        var engagements = {};
        $.each(data.objects, function (i, engagement) {
           engagements[engagement.lawyer_id] = engagement
        });
        $scope.engagements = engagements;
    });
});

services.js

angular.module('App.Services', ['ngResource']).
factory('apiCall', function ($resource) {
    return $resource('/api/v1/:type',
        {type: '@type'},
        {
            query: {
                method: 'GET',
                isArray: false
            }
        }
    );
});

controllerSpec.js

describe('controllers', function () {

    beforeEach(
        module('App', ['App.Controllers', 'App.Directives', 'App.Services'])
    );

    describe('MarketplaceCtrl', function () {
        var scope, ctrl, $httpBackend;

        beforeEach(inject(function (_$httpBackend_, $rootScope, $controller) {
            $httpBackend = _$httpBackend_;
            $httpBackend.expectGET('/api/v1/engagement?engagement_status__in=0,1').
                respond([]);
            scope = $rootScope.$new();
            /* Why is MarketplaceCtrl not working? :( */
            ctrl = $controller('MarketplaceCtrl', {$scope: scope});
        }));

        it('should have a MarketplaceCtrl controller', (function () {
            expect(ctrl).not.to.equal(null);
        }));
    });
});

1 个答案:

答案 0 :(得分:3)

结束使用此示例https://github.com/tebriel/angular-seed/commit/b653ce8e642ebd3e2978d5404db81897edc88bcb#commitcomment-3416223

基本上:

describe('controllers', function(){
    beforeEach(module('myApp.controllers'));

    it('should ....', inject(function($controller) {
        //spec body
        var myCtrl1 = $controller('MyCtrl1');
        expect(myCtrl1).toBeDefined();
    }));

    it('should ....', inject(function($controller) {
        //spec body
        var myCtrl2 = $controller('MyCtrl2');
        expect(myCtrl2).toBeDefined();
    }));
});