如何使用 Angular 6 在 Jasmine 中对 ngrx 功能选择器进行单元测试?

J-m*_*man 6 unit-testing jasmine ngrx angular angular6

我的产品功能有一个功能选择器和相邻的选择器:

const getProductState = createFeatureSelector<fromProducts.State>('products');

export const getOldProducts = createSelector(
    getProductState,
    state => state.oldProducts
);

export getNewProducts = createSelector(
    getProductState,
    state => state.newProducts
);
Run Code Online (Sandbox Code Playgroud)

我想对这些选择器进行单元测试。我读过的大多数文章和帖子都只涉及非特征选择器,所以是时候模拟特征状态了,我的测试将返回undefined状态对象。我的规范文件如下所示:

beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports: [
            StoreModule.forRoot({}),
            StoreModule.forFeature('products', fromProduct.reducer)
        ],
        declarations: [],
        providers: [{
            provide: Store, useClass: class { select = jasmine.createSpy('select'); dispatch = jasmine.createSpy('dispatch'); }
        }]
    })
    mockStore = TestBed.get(Store);
}));

it('getOldProducts should return the oldProducts', () => {
    const state = {
        name: 'Product1',
        oldProduct: {
            price: 45.00
        },
        newProduct: {
            price: 50.00
        }
    }: fromProduct.State;
    expect(selectors.getOldProducts(state.oldProducts)).toBe(state.oldProducts);
});
Run Code Online (Sandbox Code Playgroud)

错误一直说Cannot read property 'oldProducts' of undefined,这让我相信getProductState功能选择器没有被正确模拟。

谢谢!

art*_*ide 7

我遇到了同样的问题,这个线程帮助了我。虽然解决方案还不清楚。

projector正如@J-man 所说,您需要使用选择器中的函数。对于您的情况将是:

expect(selectors.getOldProducts.projector(state.oldProducts)).toBe(state.oldProducts);