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

欢迎!请参阅 关于页面以了解更多关于此怎样工作的信息。

+7
Test

当查看用 clojure.test 编写的测试的 (log) 输出时,我希望能够识别与每个测试相关的输出。在 :each fixture 中暴露当前测试变量的机制可以实现这一点。

一种可能的机制是在调用 clojure.test/test-all-vars 中的 each-fixture-fn 之前,使用现存的测试变量绑定一个 test-var 变量。

建议:建议的补丁 (clj840-20161122.diff) 允许 'each' fixture 通过使用 * } 访问与当前正在执行的测试相关联的变量。因此,通过这一改变,'each' fixture 能够访问与当前测试变量相关联的元数据,包括名称。

该补丁通过更改测试及其相关 'each' fixture 运行时函数包装的顺序来实现上述功能。在此补丁之前,'each' fixture 被组合成一个单一的更高阶函数,然后分配一个包含 {{test-var}} 函数调用的匿名函数,作为其体执行。在这之后,{{test-var}} 函数现在负责连接和执行 'each' fixture,但重要的是,它是在添加当前测试变量到 * } 的绑定表达式的作用域内执行的。现在 {{test-var}} 调用的是连接的 fixture 函数,而不是将包含 {{test-var}} 调用的匿名函数模板传递给连接的 fixture 函数。

补丁:clj840-20161122.diff

你好,我想表达一下我对添加此功能有用的看法,在 Clojure 测试库中我会发现这个功能很有用。

对于我的使用场景,我只需要邓肯的4行补丁,该补丁添加了 `*test-var*` 并将其绑定到 `each-fixture-fn` 表达式周围。

我将使用此功能在重写的 `state-flow` 测试库中使用基础 `clojure.test` 块(`deftest` + fixtures)以允许更好地与现有的 Clojure 工具生态系统集成。没有在 fixture 中访问当前测试变量的方法,我在 fixture 中无法找到执行某些测试设置的方法([https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74](https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74) 描绘了代码中的用例)

共有17个回答

0

评论者:stuart.sierra

或者直接将Var传递给fixture。Vars是可以调用的。

0

评论者:hugoduncan

我不认为这样可行,因为传递给fixture的函数不是test var,而是一个调用{{test-var}}的函数。

0

评论者:hugoduncan

添加 test-var 的补丁

0

评论者:stuart.sierra

                                                                *  } already has this information, but it's not visible to the fixture functions because it gets bound inside {{test-var}}.

也许应该将{{:each}} fixture函数在{{test-var}}而不是在test-all-vars中调用。(Var的命名空间在其元数据中可用。)但是这样我们就必须在每次调用{{test-var}}时在里面调用{{join-fixtures}}。

0

评论者:stuart.sierra

尝试这个补丁:clj840-2.diff。

这使 * } 对{{:each}} fixture函数可见,这在直觉上似乎更正确。

但是它稍微改变了{{test-var}}的行为,这让我不太高兴。

0

评论者:hugoduncan

在 * } 上提供一个函数返回当前 test-var 是否有意义?

0

评论者:stuart.sierra

不,这个函数是 {{first}}

0

评论者:hugoduncan

我同意将动态变量作为扩展接口的一部分,但认为在编写测试时有一个函数会更为简洁。仅代表我个人意见。

0

评论者:jafingerhut

在 2013 年 11 月 22 日提交的补丁 clj840-2.diff 已不再适用于最新 master 版本。更新它看起来可能很简单,但最好由熟悉这部分代码的人来做。

0

评论者:joelittlejohn

如果这个问题得到解决,我会觉得非常有用。

我已经添加了一个更新后的补丁,它与 clj840-2.diff 具有相同的内容,但适用于截至 2016 年 11 月 22 日的当前 master 版本(c0326d2)。

0

评论者:joelittlejohn

我意识到我只翻译了其他人提供的一个补丁,但如果在将其提交审批前您认为还需要进一步的改动,请随时提出,我会尽力添加。谢谢。

0

评论由:alexmiller 制作

如果您能更新工单,以更好地描述补丁的采用方法,那就太有帮助了。

0

评论者:joelittlejohn

所提出的补丁(clj840-20161122.diff)允许 'each' 补丁通过使用 * } 访问与当前正在执行的测试相关联的变量。由于此更改,'each' 补丁能够访问与当前测试变量相关联的元数据,包括名称。

该补丁通过更改测试及其相关 'each' fixture 运行时函数包装的顺序来实现上述功能。在此补丁之前,'each' fixture 被组合成一个单一的更高阶函数,然后分配一个包含 {{test-var}} 函数调用的匿名函数,作为其体执行。在这之后,{{test-var}} 函数现在负责连接和执行 'each' fixture,但重要的是,它是在添加当前测试变量到 * } 的绑定表达式的作用域内执行的。现在 {{test-var}} 调用的是连接的 fixture 函数,而不是将包含 {{test-var}} 调用的匿名函数模板传递给连接的 fixture 函数。

希望这样比较清楚吧 :)

0

评论者:joelittlejohn

现在是否有机会考虑将其包括在内?文件 clj840-20161122.diff 仍然有效,并且可以应用于 master 的当前 HEAD。

0

评论由:alexmiller 制作

你能检查一下更改函数顺序是否影响了 do-report 中的堆栈跟踪检查吗?基本上,对于所有各种情况(既不是每个也不是一次,每个但不是一次,一次但不是每个,以及两者),重要的是了解错误报告不受所有这些情况的影响。另外,像 Leiningen 这样的工具也修补了这个部分的某些部分。我认为这一切都很好,但我可能不会马上检查这一切。

...