Skip to content

Instantly share code, notes, and snippets.

@benjamincharity
Created April 12, 2017 16:23
Show Gist options
  • Star 35 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save benjamincharity/3d25cd2c95b6ecffadb18c3d4dbbd80b to your computer and use it in GitHub Desktop.
Save benjamincharity/3d25cd2c95b6ecffadb18c3d4dbbd80b to your computer and use it in GitHub Desktop.
Mock ActivatedRoute with params, data and snapshot.
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
MdToolbarModule,
],
providers: [
{
provide: Router,
useClass: MockRouter,
},
{
provide: ActivatedRoute,
useValue: {
data: {
subscribe: (fn: (value: Data) => void) => fn({
company: COMPANY,
}),
},
params: {
subscribe: (fn: (value: Params) => void) => fn({
tab: 0,
}),
},
snapshot: {
url: [
{
path: 'foo',
},
{
path: 'bar',
},
{
path: 'baz',
},
],
},
},
},
],
})
.overrideComponent(ConversationsComponent, {
set: {
template: '',
}
});
}));
@michael-mckenna
Copy link

Whoop!

@rafaelji
Copy link

Thanks!

@spannozzo
Copy link

thanks a lot. you save my day

@hlpupo
Copy link

hlpupo commented Jul 7, 2019

awesome, thanks a lot, you save a lot of time

@Zory1
Copy link

Zory1 commented Nov 14, 2019

Thanks a bunch!

@arozwalak
Copy link

hey, thanks for that. Was wondering if anyone can help to solve my issue. I'm trying to figure out how I can mock route data in case I need to set different value in a specific test (after TestBed has been configured)?

@benjamincharity
Copy link
Author

Haven't tested this directly, but I believe you should be able to do something along the lines of:

const myRouteDataFactory = new BehaviorSubject(myDefaultData);

...

                    data: {
                        subscribe: (fn: (value: Data) => void) => fn({
                            myDataKey: myRouteDataFactory.getValue(),
                        }),
                    },

...

// First test here...

...

// Then later, update the factory data before spinning up a second test:
myRouteDataFactory.next(myNewData);

// Second test here..

@arozwalak
Copy link

great, I'll try that and let you know if that works. thanks!

@arozwalak
Copy link

arozwalak commented Jun 18, 2020

that works great, just in my case I had to change provider a little bit as I'm using pipe, before subscribing to route data. So in my case it looks like this

            provide: ActivatedRoute, useValue: {
              params: of(routeParams),
              data: {
                pipe: () => {
                  return {
                    subscribe: (fn: (value) => void) => fn({
                      myDataKey: routeDataFactory.getValue()
                    })
                  };
                }
              },
              snapshot: {}
            }
          }

@benjamincharity
Copy link
Author

Awesome! Glad to know that works 💪

@hpmartini
Copy link

perfect!

Just in case someone plans to mock the paramMap -> params.get() function here you go:

{
  provide: ActivatedRoute,
  useValue: {
	paramMap: Observable.of({
	  get: () => {
		return 10;
	  }
	})
  }
}

Thanks! That's what I neded!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment