gpt4 book ai didi

mocking - 如何模拟@ngrx/store?

转载 作者:行者123 更新时间:2023-12-04 22:56:34 24 4
gpt4 key购买 nike

我想对组件进行单元测试。我正在使用 @ngrx/store 和 rxjs 来从我的组件更新我的商店。为此,我订阅和取消订阅商店。
我的单元测试失败了

TypeError: undefined is not an object (evaluating 'this.store.unsubscribe') in config/spec-bundle.js



我无法找到如何正确模拟我的商店及其事件发射器。

以下是以下几行:

app.component.ts :
  ngOnDestroy() {
// unsubscribe the observable
this.userStore.unsubscribe();
}

app.component.spec.ts :

我如何模拟商店:
        export class MockStore extends Subject<fromRoot.State> implements Store <fromRoot.State> {}

我如何配置:
        TestBed.configureTestingModule({
imports: [
FormsModule,
ReactiveFormsModule,
StoreModule.provideStore(reducer)
],
declarations: [LoginComponent],
providers: [
BaseRequestOptions,
MockBackend,
{ provide: AuthService, useValue: authServiceStub },
{ provide: LoginService, useValue: loginServiceStub },
{ provide: LoggerService, useValue: loggerServiceStub },
{
provide: Http, useFactory: (backend: ConnectionBackend,
defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}, deps: [MockBackend, BaseRequestOptions]
},
{ provide: Router, useClass: MockRouter }
]
})

如果您想了解更多信息,请告诉我。提前致谢。

最佳答案

有不止一种方法可以模拟商店,你做什么取决于你想如何测试。

当我在测试中模拟商店时,我只对两件事感兴趣:

  • 能够轻松发出与测试相关的状态;和
  • 能够看到在测试期间发送到商店的任何操作。

  • 我对连接 reducer 不感兴趣,因为它们在其他地方进行了测试,所以这就是我所做的。

    我使用这样的函数来创建 Store来自两个 Subject实例:
    import { Action, Store } from "@ngrx/store";
    import { Subject } from "rxjs/Subject";

    export function mockStore<T>({
    actions = new Subject<Action>(),
    states = new Subject<T>()
    }: {
    actions?: Subject<Action>,
    states?: Subject<T>
    }): Store<T> {

    let result = states as any;
    result.dispatch = (action: Action) => actions.next(action);
    return result;
    }

    beforeEach我创建了 Store并将其添加到 TestBedproviders :
    actions = new Subject<Action>();
    states = new Subject<AppState>();
    store = mockStore<AppState>({ actions, states });

    TestBed.configureTestingModule({
    imports: [EffectsTestingModule],
    providers: [
    {
    provide: Store,
    useValue: store
    },
    ...
    ]
    });

    带着 mock 的 Store注入(inject)组件 - 或效果,或任何你正在测试的东西 - 然后在测试中发出特定状态很简单 - 使用 states主题 - 通过订阅 actions 可以很容易地检查任何预期的操作已被发送。学科。

    关于您的错误,您不应该调用 unsubscribeStore ;您应该调用 Subscription 订阅商店时返回的对象 - 如另一个答案中所述。

    关于mocking - 如何模拟@ngrx/store?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43215024/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com