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

标签 angular unit-testing jasmine angular6 ngrx

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

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

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

export getNewProducts = createSelector(
    getProductState,
    state => state.newProducts
);

我想针对这些选择器进行单元测试。我阅读的大多数文章和帖子只涉及非特征选择器,所以是时候模拟特征状态了,我的测试返回状态对象的 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);
});

错误一直说 无法读取未定义的属性“oldProducts”,这让我相信 getProductState 功能选择器没有被正确模拟。

谢谢!

最佳答案

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

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

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

关于angular - 如何使用 Angular 6 在 Jasmine 中对 ngrx 功能选择器进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51754766/

相关文章:

unit-testing - 使 Mocha 测试显示实际错误

javascript - Angular-Jasmine,加载 json

angular - 在带有单元测试 angular + jasmine 和 SpyOn 的 switchMap 中永远不会调用函数

javascript - 设置从 @Input 获取数据的标志

angular - 在 anchor 元素上设置(单击)属性

angularjs - 在 Jasmine 单元测试中设置 ReactiveForm 的值

javascript - jasmine describe函数中的beforeEach和afterEach自动添加代码

forms - Angular 2 - 一次发布/放置多个表单

angular - 静态服务器端渲染或动态服务器端渲染

python - 我如何在 celery 中测试 on_failure