jjaskulowski
jjaskulowski

Reputation: 2564

Injecting custom factory in jasmine test

I tried to inject a factory to my controller in jasmine test like in Unit testing AngularJS factories that have dependencies

When I $provide a factory in the test, I would expect the controller to use the provided factory. But the console.log still prints 'real value'. I don't get it.

var app = angular.module('mod', []);

app.factory('factoryA', [
    function () {
        return "real value";
    }
]);

app.controller('myController', ['factoryA',
    function (factoryA) {
        console.log(factoryA);
    }
]);


describe("test", function() {
    var $scope, $controller, $httpBackend;
    var app;

    beforeEach(function() {
        module(function($provide) {
            $provide.factory('factoryA', function () { return "fake value"; });
        });
        app = module("mod");

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

    });

    it("works", function() {
        $controller("myController", { '$scope': $scope });
    });

});

Upvotes: 1

Views: 3200

Answers (1)

PSL
PSL

Reputation: 123739

You would need to get the $provider from the module mod so pass module name as first argument so that it overrides the factoryA definition that was created originally. Or load the module - module("mod") - before setting up mock.

   module('mod', function($provide) {
        $provide.factory('factoryA', function () { return "fake value"; });
    });

Another way it to create mocks and pass it to the controller creation.

describe("test", function() {
    var $scope, $controller, $httpBackend;
    var app, factoryA;

    beforeEach(function() {
        module(mod);

        inject(function (_$controller_, _$httpBackend_, $rootScope) {
            //...Your code
            //Mock factory
            factoryA = jasmine.createSpy('factoryA');
            factoryA.and.returnValue("fake value");
        });

    });

    it("works", function() {
        //Pass the mock factory
        $controller("myController", { '$scope': $scope, factoryA:factoryA });
    });

});

Upvotes: 4

Related Questions