Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

spyOn could not find an object to spy upon for start()

I am using angular-cli testing framework.

inside my component , I have used 'ng2-slim-loading-bar' node module.

submit(){
    this._slimLoadingBarService.start(() => {
    });
    //method operations
}

Now when I am testing this component, I have applied spyOn this service as :

beforeEach(() => {
    let slimLoadingBarService=new SlimLoadingBarService();
    demoComponent = new DemoComponent(slimLoadingBarService);
    TestBed.configureTestingModule({
        declarations: [
            DemoComponent
        ],
        providers: [
            { provide: SlimLoadingBarService, useClass: SlimLoadingBarService}
        ],
        imports: [
            SharedModule
        ]
    });
});
it('should pass data to servie', () => {
    spyOn(slimLoadingBarService,'start').and.callThrough();
   //testing code,if I remove the above service from my component, test runs fine
});

but its not working.

It throws below error:

spyOn could not find an object to spy upon for start()

like image 517
Bhushan Gadekar Avatar asked Oct 18 '16 11:10

Bhushan Gadekar


2 Answers

Declaring slimLoadingBarService with let, you are constraining its scope to the beforeEach callback scope. Declare it with var, or better, declare it after the proper describe() block and set its content within beforeEach callback function:

describe("some describe statement" , function(){
    let slimLoadingBarService = null;

    beforeEach( () => {
        slimLoadingBarService=new SlimLoadingBarService();

    });

    it('should pass data to service', () => {
        spyOn(slimLoadingBarService,'start').and.callThrough();
       //testing code,if I remove the above service from my component, test runs fine
    });
});
like image 62
Sergeon Avatar answered Oct 16 '22 20:10

Sergeon


it's due to non declaration in beforeEach

updated syntax after angular 10

beforeEach(() => {
    slimLoadingBarService = TestBed.inject(SlimLoadingBarService);
});

before angular 10

beforeEach(() => {
    slimLoadingBarService = TestBed.get(SlimLoadingBarService);
});
like image 8
nirmal Avatar answered Oct 16 '22 20:10

nirmal