4

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?

2 Answers 2

12

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

Sign up to request clarification or add additional context in comments.

2 Comments

i am getting url property dosn't exist error. Note: url is a read-only property, does it have any effect on spyOnProperty() behavior ?
define your router object after your describe. then this is what worked for me: 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(); });
0

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();
});
...
});

1 Comment

Is there any way to update the router url afterwards?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.