Trafalgar
Trafalgar

Reputation: 401

Jasmine spy on RxJS 5.5 operators

I am trying to spy on RxJS operators with Jasmine. There are different use cases in my tests where I want to be in control on what a Observable returns. To illustrate what I am trying to do I have created the example above even thought it does not make to much sense as this observable always returns the same hard coded string. Anyway it is a good example to show what I am trying to achieve:

Imagine I have the following Class.

import {Observable} from 'rxjs/Observable';
import {of} from 'rxjs/observable/of';

export class AwesomeTest {

   constructor() {
   }

   getHero(): Observable<string> {
      return of('Spiderman');
   }
}

And the following test:

import {AwesomeTest} from './awesomTest';
import {of} from 'rxjs/observable/of';
import createSpyObj = jasmine.createSpyObj;
import createSpy = jasmine.createSpy;

describe('Awesome Test', () => {

  let sut;

  beforeEach(() => {
    sut = new AwesomeTest()
  })

  fit('must be true', () => {
    // given
    const expectedHero = 'Superman'
    const asserter = {
        next: hero => expect(hero).toBe(expectedHero),
        error: () => fail()
    }
    createSpy(of).and.returnValue(of('Superman'))
    // when
    const hero$ = sut.getHero()
    // then
    hero$.subscribe(asserter)
  });
});

I try to spy on the Observable of operator and return a Observable with a value that I specified inside my test instead of the actual value it will return. How can I achieve this?

Before the new Rx Import Syntax I was able to do something like this:

spyOn(Observable.prototype,'switchMap').and.returnValue(Observable.of(message))

Upvotes: 4

Views: 2828

Answers (1)

user2287523
user2287523

Reputation: 49

In your spec file, everything as a wildcard (don't worry about tree shaking, this is just for the tests)

import * as rxjs from 'rxjs';

You can then use rxjs for your spying

spyOn(rxjs, 'switchMap').and.returnValue(rxjs.of(message))

Upvotes: 2

Related Questions