我本地试了一下。看起来有几个因素在起作用:
你引用的 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 &&