2024 Clojure状态调查!中分享您的想法。

欢迎!请在关于页面查看更多有关此功能的信息。

0
ClojureScript

上下文:使用 cljs.spec.test.alpha/instrument 仪器化被 fdef 过的函数。使用不满足参数规范的数据调用其中的一个函数。抛出的异常目前没有提供很多上下文

  1. 异常信息包含“缺少文件名”和“缺少行号”——理想情况下这些应该包含违规调用所在的文件和行号
  2. 异常数据被编码以包含有关调用者的信息,但当前实现在此处总是返回 nil

结果是,违反 fdef 参数规范而失败,没有追踪回调用——它只告诉你哪个函数的规范没有得到满足。

我开始调查并发现了一些故障,但没有完整的建议。我提供目前为止的补丁,希望能够得到一些意见,看看我是否应该继续调查。

到目前为止我发现以下内容

  1. **target** 被假定为 "browser",而它被文档记录为在浏览器中使用 "default"。在第一个补丁中已修复
  2. 在尝试解析堆栈跟踪以查找调用者时,host 包含了端口号。在第二个补丁中解决
  3. 在尝试解析堆栈跟踪时,使用 goog.userAgent.product 来确定浏览器,但它并不可靠——例如,当 Chrome 处于响应式设计模式时,product/IPHONE 为真。这是不正确的,并且在 cljs.spec.test.alpha 的情况下是无助的,因为它根本不识别 iPhone。由于用户代理仅用于解析堆栈跟踪,我通过从堆栈跟踪中推断用户代理来修复此问题。
  4. find-caller 函数使用了错误的包名来查找 spec_checking_fn。此外,它在包名中硬编码点,而有些浏览器使用 $。我在第四个补丁中修复了此问题。我还将创建错误的操作移出 conform! 匿名函数之外,因为在这里放置它会从堆栈跟踪中删除 spec-checking-fn

使用这些补丁,调用者可可靠地设置,尽管它似乎没有反映起源的调用位置。此外,抛出的异常仍然缺少文件名和行号。如果您有兴趣最终接受这些补丁,我会很高兴继续调查并添加一些测试。

作为备注:在我看来,从堆栈跟踪中推断用户代理的功能更适合放在stacktrace.cljs中,并且我强烈认为在没有提供user-agent-product时(而不是当前的行为:未修改地返回堆栈跟踪字符串),这应该是默认行为。如果感兴趣,我也很乐意修复这个问题,并添加一些测试。请注意,当前的方法允许Safari走Firefox的路,效果很好。

最后:如果我在同一个地方放了很多东西,我很乐意按指示拆分。

3 答案

0
by

评论由:dnolen 制作

谢谢!你提交了CA吗?

0
by

评论由:cjohansen 制作

当然有了 :)

0
by
参考:[https://clojure.atlassian.net/browse/CLJS-2758](https://clojure.atlassian.net/browse/CLJS-2758)(由 alex+import 报告)
...