Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: Expected a spy, but got Function

Here is my controller:

    export class testController  {
    static $inject: string[] = ["testService", "$mdDialog", "$state"];
    constructor(public _testService: services.testService, private _mdDialog: any, private _$state: any) {
        this.isCurrentlyEditing = false;
        this.activate();
    }
    }

Here is my unit test for that:

  import {test as service}  from './test.service';
  import {test as ctrl} from './test.controller';

  export function main() {
    describe("testController", () => {

    var mdDialog: angular.material.IDialogService;
    var state: ng.ui.IStateService;
    var testService: any;
    var controller: any;

    beforeEach(function () {
        angular.mock.module('comp.modules.addField');           
    });
    beforeEach(function () {
        testService = {
            showCLULayer: () => { }
        };
    });

    beforeEach(module('comp'));
    beforeEach(inject(($injector: any) => {

        mdDialog = $injector.get('$mdDialog');
        state = $injector.get('$state');
        testService = $injector.get('testService');
        controller = new ctrl.testController(testService, mdDialog, state);
    }));

    it("should Create Controller", () => {          
        controller = new ctrl.testController(testService, mdDialog, state);
        spyOn(testService, 'showCLULayer').and.callThrough();
        expect(controller).not.toBeNull();
        expect(controller.activate).toHaveBeenCalled();  
        ////error Expected a spy, but got Function.      
    });       

});
}

The test throws error when it goes to the line:

 expect(controller.activate).toHaveBeenCalled();

saying that Expected a spy, but got Function. Activate is a function that gets called when i call constructor of my controller which I am testing. Can some one point me in right direction please.

Tried adding the line

    spyOn(controller, 'activate'); 

before expect, I am getting the following error.

   Expected spy activate to have been called.
   Error: Expected spy activate to have been called.
like image 373
Aj1 Avatar asked Nov 11 '15 21:11

Aj1


1 Answers

You need to spy on a function before you test whether or not its been called. Try this:

it("should Create Controller", () => {          
        controller = new ctrl.testController(testService, mdDialog, state);
        spyOn(testService, 'showCLULayer').and.callThrough();
        expect(controller).not.toBeNull();

        spyOn(controller, 'activate');  // < ------------Spy on the function
        expect(controller.activate).toHaveBeenCalled();  
        ////error Expected a spy, but got Function.      
    });    
like image 174
sma Avatar answered Nov 05 '22 09:11

sma