You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:22:01