单元测试

使用NGXS时可以轻松进行单元测试。 为了执行单元测试,我们只是调度事件,侦听更改并执行想要进行的操作。 基本测试如下所示:

import { TestBed } from '@angular/core/testing';

describe('Zoo', () => {
  let store: Store;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [NgxsModule.forRoot([ZooState])]
    });

    store = TestBed.inject(Store);
  });

  it('it toggles feed', () => {
    store.dispatch(new FeedAnimals());

    const feed = store.selectSnapshot(state => state.zoo.feed);
    expect(feed).toBe(true);
  });
});

我们建议使用 selectSnapshot 方法而不是 selectOnceselect 。 茉莉花(Jasmine)和杰斯特(Jest)可能不会在“订阅”(Subscribe)块内运行。 给出以下示例:

预备状态

Often times in your app you want to test what happens when the state is C and you dispatch action X. You can use the store.reset(MyNewState) to prepare the state for your next operation. 在您的应用中,您通常想测试状态为C并调度动作X时会发生什么。您可以使用 store.reset(MyNewState) 来准备用于下一个操作的状态。

注意:如果您重置状态,则需要提供注册状态名称作为密钥。 store.reset 将体现您的整个状态! 用新更改的合并到当前状态,以确保不会丢失任何内容。

测试选择器

选择器只是接受状态作为参数的简单函数,因此测试它们非常容易。 一个简单的测试可能看起来像这样:

在您的应用程序中,您可能会使用 createSelector 函数动态创建选择器:

测试这些选择器确实很容易。 您只需要模拟状态并将其作为参数传递给我们的选择器:

测试异步动作

使用Jasmine或Jest测试异步操作也非常容易。 这些测试框架的最大特点是对 async/await 的支持。 没有人会阻止您使用async/await + RxJS toPromise方法将 Observable 转换为 Promise 。 另外,您也可以执行 done 回调,Jasmine或Jest将等到调用 done 回调后再完成测试。

下面的例子并不是很复杂,但是清楚地显示了如何使用 async/await 测试异步代码:

Last updated

Was this helpful?