我正在使用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
它实际上不是MemberStore
Jasmine间谍对象的实例(并createSpyObj
返回any
)。但是,mockMemberStore.members = []
由于它是只读属性,因此会生成编译错误。
编辑:原来我错读了错误,并且不是该代码提供了错误。这不是编译错误,而是运行时错误。出人意料的是,即使我
members
是只读的,TSC也不关心是否在编译时给它赋了一个值。在上面的示例中,我MemberStore
完全用茉莉SpyObj 代替了,可以正常工作。如果相反,我只是尝试使用spyOn
的实际版本MemberStore
,那是当我看到members
无法分配的运行时错误时 。例
我可以将其更改为var mockMemberStore:any
,或使用强制转换如(
,但是编译器不会将其members
视为对ModelStore/members
所有静态类型检查的引用(并且“查找引用”和“重构/重命名”之类的内容不起作用)。在这里使用什么方法?
您应该能够写:
(mockMemberStore as any).members = [""];
这不会更改以后对的任何引用的类型mockMemberStore
。由于这是一个单元测试,因此代码不需要像通常那样完美。重要的是,如果引入错误,它将失败,并且在这种情况下,它将失败:如果执行无效的重构,renamedMembers
将不再设置,并且测试应该崩溃,并且您可以修复它。
这是不理想的,因为您会丢失查找用例,但是它并不像其他语言那样糟糕(嘲笑只读对象非常麻烦)。