如何在ClojureScript中为Mock的Realm对象添加构造函数声明
如何Mock Realm构造函数避免调用真实库?
我懂你现在的困扰——在ClojureScript里基于Realm开发,想临时Mock掉真实库,结果之前的写法只覆盖了实例方法,却因为没模拟构造函数报了dependencies.realm is not a constructor的错,对吧?
问题出在你之前把realm定义成了普通JS对象,而Realm原本是个可被new调用的构造函数,所以你的Mock得符合这个结构才行。给你两种可行的写法:
简单直接的函数式Mock
直接把realm定义成一个函数,调用它(配合ClojureScript里的.语法,对应JS的new)时返回带有实例方法的对象:
(def realm (fn [options] #js {:schemaVersion (fn []) :close (fn [])}))
这样当你执行(realm. (clj->js options))时,就和调用真实的Realm构造函数一样,会得到一个带有你需要的close和schemaVersion方法的实例。
贴近原型链的Mock(更贴近真实Realm结构)
如果你的代码还用到了Realm的原型方法或者静态方法,可以用这种方式,更贴近JS类的结构:
;; 先定义构造函数 (def RealmMock (fn [options] (this-as this ;; 这里可以加实例初始化逻辑,比如根据options设置属性 this))) ;; 把实例方法挂载到原型上 (set! (.-schemaVersion (.-prototype RealmMock)) (fn [])) (set! (.-close (.-prototype RealmMock)) (fn [])) ;; 如果需要静态方法,比如Realm.open,直接给构造函数加属性 (set! (.-open RealmMock) (fn [opts] (js/Promise.resolve (RealmMock. opts)))) ;; 最后把realm指向这个Mock构造函数 (def realm RealmMock)
这样不管是用(realm. ...)创建实例,还是调用静态方法,都能正常Mock了。
内容的提问来源于stack exchange,提问作者Volodymyr K.
相关产品推荐
相关产品推荐

