QUnit에서 이상한 문제가 발생하고 있습니다.
이 테스트는 매우 간단하고 직관적으로 동작해야 하는데 … 하지만 …
플러그인 설정값이 제가 설정해 둔 값에서 변경되고 있습니다.
boundingbox: ["51.2867601", "51.6918741", "-0.5103751", "0.3340155"],
type: "city",
},
},
});
needs.site(cloneJSON(siteFixtures["site.json"]));
needs.settings({
location_enabled: true,
location_users_map: true,
hide_user_profiles_from_public: false,
location_topic_default: "user",
default_composer_category: 11,
});
test("composer includes default location", async function (assert) {
await visit("/");
await click("#create-topic");
assert.equal(
query(".composer-controls-location span.d-button-label").innerText,
"London, Greater London, England, United Kingdom"
Composer가 로드되는 결과로 JavaScript가 실행될 때, acceptance 블록의 앞부분에서 설정한 설정값이 더 이상 동일하지 않습니다!
테스트 코드에서 설정한 대로 "user"여야 하는데, 콘솔 로그를 확인하면 다음과 같은 값이 표시되고, 이로 인해 테스트가 실패합니다:
여기서 제가 뭔가 어리석은 실수를 하고 있는 건가요? location_topic_default 값이 user에서 none으로 변경되는 이유는 무엇일까요?
기본값을 참고해 주세요:
needs.settings의 스코프가 여기서는 올바르게 설정된 것일까요?
needs.settings가 순서를 벗어나 acceptance 스코프 밖에서 실행되는 것처럼 보입니다 …
david
(David Taylor)
8월 7, 2023, 10:53오전
2
로컬에서 직접 테스트해 봤습니다. 몇 가지 요인이 작용하는 것 같습니다:
참고하고 계신 siteSettings 객체는 초기화 프로그램(initializer)에 의해 가져와지며, 이후 modifyClass 호출에서 사용됩니다:
초기화 프로그램은 각 테스트마다 다시 실행됩니다. 문제는 이전 테스트에서 수행된 modifyClass 호출을 '초기화(reset)'할 방법이 없다는 것입니다. 우리의 해결책은 pluginId 파라미터입니다. 이는 전체 테스트 스위트 에서 첫 번째 modifyClass 호출만 실제로 사용됨을 의미합니다. 이후 테스트의 초기화 프로그램에서 modifyClass를 호출해도 무시됩니다.
일반적으로는 문제가 되지 않습니다. modifyClass 호출 내부의 코드는 테스트 실행마다 변경되지 않는 경향이 있기 때문입니다. 그러나 이 경우 초기화 프로그램의 스코프에서 siteSettings 참조를 사용하고 있습니다.
요약하자면: 테스트 환경에서 이 구현 방식은 modifyClass가 가장 먼저 실행된 테스트의 사이트 설정에 고정되어 있게 됩니다.
해결책은 ‘초기화’ 시점이 아닌 '실행 시(runtime)'에 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 &&
데이비드, 정말 감사합니다! 꽤나 함정이었네요!
David,
참고로 알려드립니다.
여기에는 동일한 원인일 것으로 의심되는 또 다른 문제가 있습니다:
currentUser도 이니셜라이저(initialiser)에서 정의되어 있습니다.
잘못된 테스트가 두 번째로 실행되면 이 값이 평가되고, 더 이상 정의되지 않아 테스트를 함께 실행할 때 “반쪽” 정도는 실패할 수 있습니다.
Composer 모델에 user가 있는 것 같으니, 그쪽으로 전환해 보겠습니다 …