当前位置:  开发笔记 > 编程语言 > 正文

在TypeScript中模拟只读Flux商店属性

如何解决《在TypeScript中模拟只读Flux商店属性》经验,为你挑选了1个好方法。

我正在使用React,Flux和TypeScript创建一个应用程序。我正在使用Karma和Jasmine进行测试。

我有一家商店,像这样:

class MemberStore {
    private _members:Member[];
    public get members():Member[] { return this._members; }
}

与所有Flux商店一样,数据是只读的,并通过操作处理程序(未显示)而非设置程序进行修改。

我想在依赖的代码的单元测试中模拟此数据存储MemberStore。但是,由于members是只读的,因此我无法执行以下操作:

var mockMemberStore:MemberStore = jasmine.createSpyObj("MemberStore");
mockMemberStore.members = [/*mock members*/];

上面的代码实际上发出了可运行的JS,因为mockMemberStore它实际上不是MemberStoreJasmine间谍对象的实例(并createSpyObj返回any)。但是,mockMemberStore.members = []由于它是只读属性,因此会生成编译错误。

编辑:原来我错读了错误,并且不是该代码提供了错误。这不是编译错误,而是运行时错误。出人意料的是,即使我members是只读的,TSC也不关心是否在编译时给它赋了一个值。在上面的示例中,我MemberStore 完全用茉莉SpyObj 代替了,可以正常工作。如果相反,我只是尝试使用 spyOn的实际版本MemberStore,那是当我看到members无法分配的运行时错误时 。例

我可以将其更改为var mockMemberStore:any,或使用强制转换如( mockMemberStore).members = [],但是编译器不会将其members视为对ModelStore/members所有静态类型检查的引用(并且“查找引用”和“重构/重命名”之类的内容不起作用)。在这里使用什么方法?



1> mk...:

您应该能够写:

(mockMemberStore as any).members = [""];

这不会更改以后对的任何引用的类型mockMemberStore。由于这是一个单元测试,因此代码不需要像通常那样完美。重要的是,如果引入错误,它将失败,并且在这种情况下,它将失败:如果执行无效的重构,renamedMembers将不再设置,并且测试应该崩溃,并且您可以修复它。

这是不理想的,因为您会丢失查找用例,但是它并不像其他语言那样糟糕(嘲笑只读对象非常麻烦)。

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有