angular - 故事书:在组件级别注入(inject)一个模拟的提供者/服务

标签 angular ngrx storybook angular-storybook

我有一个具有组件级提供程序的 Angular 组件。

@Component({
  selector: 'storybook-di-component',
  templateUrl: './di.component.html',
  providers: [{ provide: TEST_TOKEN, useValue: 123 }],
})
export class DiComponent {
  @Input()
  title: string;

  constructor(
    protected injector: Injector,
    protected elRef: ElementRef,
    @Inject(TEST_TOKEN) protected testToken: number
  ) {}
在这种情况下,我如何让故事书注入(inject)不同的提供者,以便我可以提供替代/模拟服务?例如,在上面的 DiComponent 中,如果我想注入(inject) { provide: TEST_TOKEN, useValue: 456 } 怎么办?
真实世界的用例是我正在使用 ngrx/component-store 并且需要为组件提供一个虚拟的、预填充的存储。
(附加信息:)
在模块级别(如下所示)注入(inject)它不起作用,因为组件仍在运行并创建它自己的提供者实例:
moduleMetadata: {
        providers: [
            { provide: StateStore, useValue: stateStore }
        ],
        imports: [...],
    },

最佳答案

我最终使用低技术方法解决了这个问题。

  • 子类化 .stories.ts 中的组件文件
  • 在子类中,声明构造函数以注入(inject)除需要模拟的服务之外的所有内容。
  • 调用 super(...)注入(inject)服务+模拟服务。

  • 鉴于我的实际需要是注入(inject) ngrx/component-store 的模拟我的 stories.ts现在有如下内容:
    const stateStore = new RecordSuggestionsPageStore(mockSuggestionsService);
    stateStore.setState(() => ({
        selectableRecords: [
            { name: "John Legend", recordType: "employee" },
            { name: "Allan Davies", recordType: "employee" },
        ]
    }));
    
    @Component({
        selector: "myapp-suggested-records-page",
        templateUrl: "./suggested-records-page.component.html",
        styleUrls: ["./suggested-records-page.component.scss"]
    })
    class SuggestedRecordsPageComponentStubbed extends SuggestedRecordsPageComponent {
    
        constructor(router: Router) {
            super(stateStore, router);
        }
    }
    

    关于angular - 故事书:在组件级别注入(inject)一个模拟的提供者/服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64779479/

    相关文章:

    javascript - 如何在 Storybook 中显示副标题?

    angular - 从angular2中的字符串解析组件的类型<>

    javascript - Angular 2谷歌地图标记点击事件触发DOM中的div外观

    javascript - 在浏览器控制台中获取调度的 NGRX 项目

    angular - 如何将 Observable 数组合并为具有相同返回类型的单个 Observable

    apollo MockedProvider + Storybook 不起作用

    angular - Angular 事件前加 '$' 美元符号有什么作用?

    javascript - 如何在 Angular 6 中捕获第三方库中的数据?

    javascript - 如何在 Angular2 应用程序中使用 ngrx-effects 从商店返回分页数据或从 api 服务返回新数据?

    javascript - storybook 6.0.0中 Prop 类型表的显示方法