上下文:使用 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的路,效果很好。
最后:如果我在同一个地方放了很多东西,我很乐意按指示拆分。