上下文:使用 cljs.spec.test.alpha/instrument
仪表化 fdef
-ed 函数。用不符合参数规范的数据调用其中一个函数。抛出的异常当前没有提供很多上下文。
- 异常消息包含 "缺少文件名" 和 "缺少行号"——理想情况下,这些应包含违规调用的文件和行号。
- 异常数据编码为包含有关调用者的信息,但当前实现始终在此处返回
nil
。
结果是,不符合 fdef 参数规范会导致无法追踪回调用——它只能告诉你哪个函数的规范没有被满足。
我开始调查,发现了一些问题,但我没有完整的建议。我在这里提供迄今为止的补丁,希望得到一些反馈,以确定是否值得我继续进行调查。
到目前为止,我发现了以下内容
**目标**
程序默认为 "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的路,效果不错。
最后:如果我把太多东西放在一个地方让您感到不舒服,我会很乐意按您的指示拆分。