user1247395
user1247395

Reputation: 419

Angular Unit Tests - how to mock router.url

I have an angular 6 application and I am trying to unit test a component where I inject the Router. In my ngOnInit method I reference this.router.url and work with it.

So now I am attempting to write a jasmine unit test and I cannot set the router.url property because it "is a constant ot read only property". I am currently mocking the router like this.

mockRouter = jasmine.createSpyObj<Router>("router", ["navigate", "navigateByUrl"]);

What else do I need to set to properly mock the url value in my test?

Upvotes: 3

Views: 9922

Answers (2)

reinaH
reinaH

Reputation: 553

this is what worked for me:

describe('Yourserviceorcomponent', () => {

...

let router: Router;

...

beforeEach(() => {
TestBed.configureTestingModule({
  providers: [
    {
      provide: Router,
      useValue: {
        url: '/page1',
        events: of(new NavigationEnd(0, '/page1', '/')),
        navigate: jasmine.createSpy('navigate'),
      },
    },
  ],
  imports: [RouterTestingModule],
}).compileComponents();

router = TestBed.inject(Router);

MockRender();
});
...
});

Upvotes: 0

Alex Karamushko
Alex Karamushko

Reputation: 181

Jasmine spy on property should be reasonable solution

spyOnProperty(router, 'url', 'get').and.returnValue('/users');

as recommended here https://stackoverflow.com/a/43793575/11552394

and documented in Jasmine docs https://jasmine.github.io/api/3.4/global.html#spyOnProperty

Upvotes: 11

Related Questions