上下文:使用 cljs.spec.test.alpha/instrument
仪器化 fdef
化的函数。使用不符合参数规范的数据调用这些函数之一。当前抛出的异常没有提供很多上下文。
- 异常消息包含 "缺少文件名" 和 "缺少行号" ——理想情况下,这些应该包含违规调用的文件和行号。
- 异常数据被编码以包含有关调用者的信息,但当前实现在这里总是返回
nil
。
结果是,不符合 fdef 参数规范后,无法追踪到调用——它只能告诉你哪个函数的规范没有被满足。
我开始调查,并发现了一些故障,但我没有完整的建议。我在提供迄今为止的补丁,希望能够得到一些反馈,看看是否应该继续调查。
以下是我迄今为止发现的内容:
**target**
被假定是 "browser"
,而文档中说明在浏览器中是 "default"
。已在第一个补丁中修复。
- 尝试解析堆栈跟踪以查找调用者时,
host
包含端口号。在第二个补丁中解决了这个问题。
- 尝试解析堆栈跟踪时,使用
goog.userAgent.product
来确定浏览器,但它并不可靠——例如,在响应式设计模式下,当 Chrome 是 product/IPHONE
时为真。这是错误的,在 cljs.spec.test.alpha
情况下也毫无帮助,因为该函数根本不识别 iPhone。由于用户代理仅用于解析堆栈跟踪,因此我通过从堆栈跟踪中推断用户代理来修复了这个问题。
- 使用错误的包名在
find-caller
函数中查找了 spec_checking_fn
。此外,它将点硬编码到包名中,而一些浏览器使用 $
。我在第四个补丁中修复了这个问题。我还将创建错误放置在 conform!
匿名函数之外,因为在这里放置它将使 spec-checking-fn
从堆栈跟踪中删除。
使用这些补丁,调用者被可靠地设置,尽管它似乎没有反映原始调用点。抛出的异常仍然缺少文件名和行号。如果您对最终接受这些补丁感兴趣,我很乐意继续调查并添加一些测试。
作为旁注:看起来从堆栈跟踪中推断用户代理的功能更适合放在 stacktrace.cljs 中,我强烈认为如果没有提供 user-agent-product
,则应默认使用这种行为(而不是当前:返回未经修改的堆栈跟踪字符串)。如果您有兴趣,我很乐意修复这个问题并添加一些测试。请注意,当前的方法允许 Safari 沿着 Firefox 的路径走,效果非常出色。
最后:如果我在一个地方放的东西太多,我会很乐意按照指示将其拆分,对此表示歉意。