我遇到了一个关于 QUnit 的奇怪问题。
这个测试非常简单,应该很容易……但是……
一个插件设置与我设置的值不同。
当 JavaScript 作为 Composer 加载的结果运行时,之前在 acceptance 块中设置的设置值不再相同!
它应该是“user”,就像在测试代码中设置的那样,但如果使用 console.log 打印出来,这就是我看到的,也是测试失败的原因:
我在这里做错什么了吗?为什么 location_topic_default 的值从 user 变成了 none?
请注意默认值:
needs.settings 的作用域在这里应该是正确的吗?
这几乎就像 needs.settings 的运行顺序不正确,并且超出了 acceptance 的范围……
2 个赞
david
(David Taylor)
2
我本地试了一下。看起来有几个因素在起作用:
你引用的 siteSettings 对象是通过初始化程序获取的,然后用于 modifyClass 调用:
初始化程序会为每个测试重新运行。问题是,我们无法“重置”由先前测试所做的任何 modifyClass 调用。我们的解决方案是 pluginId 参数——这意味着整个测试套件中只有第一个 modifyClass 调用会被实际使用。未来测试中的初始化程序对 modifyClass 的调用将被忽略。
这通常没问题——modifyClass 调用中的代码在每次测试运行时通常不会改变。然而,在这种情况下,你引用的是初始化程序作用域中的 siteSettings 引用。
简而言之:在测试中,这种实现意味着 modifyClass 将被固定在运行的第一个测试的站点设置上。
解决方案是使用“运行时”的 siteSettings 引用,而不是“初始化程序”时的引用。我们可以使用 model:composer 本身的引用。这个 diff 使我的测试通过了:
diff --git a/assets/javascripts/discourse/initializers/location-edits.js.es6 b/assets/javascripts/discourse/initializers/location-edits.js.es6
index 19e50c0..9d5f882 100644
--- a/assets/javascripts/discourse/initializers/location-edits.js.es6
+++ b/assets/javascripts/discourse/initializers/location-edits.js.es6
@@ -83,7 +83,7 @@ export default {
@observes("draftKey")
_setupDefaultLocation() {
if (this.draftKey === "new_topic") {
- const topicDefaultLocation = siteSettings.location_topic_default;
+ const topicDefaultLocation = this.siteSettings.location_topic_default;
if (
topicDefaultLocation === "user" &&
currentUser.custom_fields.geo_location &&
2 个赞
大卫,
供参考
这里还有另一个问题,我怀疑是出于同样的原因:
currentUser 也在初始化程序中定义。
如果错误的测试是第二个运行,则会对其进行评估,此时它不再被定义,因此当测试一起运行时,它们可能会“一半”的时间失败。
我认为 Composer 模型有 user,所以我将切换到它……
2 个赞
system
(system)
关闭
5
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.