angular-redux / platform

[Unmaintained] Redux bindings and utilities for Angular

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Unit Testing: MockNgRedux.getSelectorStub for @select with state => someFn(state)

lcecil opened this issue · comments

This is a...

  • feature request
  • bug report
  • usage question

What toolchain are you using for transpilation/bundling?

  • @angular/cli
  • Custom @ngTools/webpack
  • Raw ngc
  • SystemJS
  • Rollup
  • Other

Environment

NodeJS Version: 8.11.2
Typescript Version: ~3.1.3
Angular Version: ^7.0.1
@angular-redux/store version: ^9.0.0
@angular/cli version: (if applicable)
OS:

Code Example

Here's my selector in my component class

@select(state => getItems(state)) items: Observable<Item[]>;

where getItems is a selector function that returns items from the state that match certain criteria

Unit Test

I'm attempting to set up a unit test for this selector, following the documentation here:
https://github.com/angular-redux/platform/blob/master/packages/store/articles/intro-tutorial.md#unit-testing-selections

My test:

const stub: Subject<Item[]> = MockNgRedux.getSelectorStub<AppState, Item[]>();
const expectedValue = // mocked object representing the state;

stub.next(expectedValue);
stub.complete();

componentUnderTest.items.subscribe(
  actualValues => expect(actualValues).toEqual(expectedValue),
  null,
  done
);

But I'm getting this error in my test:

Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Questions:

Is there a way to test a selector which uses a selector function with a parameter of the entire state?
I'm using reselect for some of my selectors, but not all, and it's not working for either (see related issue: angular-redux/store#533)

My personal approach would be to ensure that you are unit testing the selector function itself only. So in your case, there should be an isolated suite of tests for getItems. Since you would fully exercise that function in a separate suite, I would skip it in your Component suite. I will however take a look at this within our suite.

Hi Andrew,

Thanks for the reply. Yes, I am testing that selector function in its own suite of tests, for sure. However, we're aiming for 100% coverage in our Component suites, and Karma is complaining those functions/lines aren't covered.

Perhaps I'll try mocking the function response through a spy. Let me know if you come up with any other solutions.