merefield
(Robert)
16. Dezember 2022 um 18:32
1
Ich arbeite gerade an diesem PR: FIX: presenting formatted location on User Card by merefield · Pull Request #73 · merefield/discourse-locations · GitHub
Ich versuche, die Änderung mit einem neuen Front-End-Test abzudecken.
Aber der Test schlägt fehl, weil ein erforderliches Datenattribut nicht definiert ist.
Das Problem, mit dem ich konfrontiert bin, ist, wie ich die Daten in Site erfolgreich mit einer Fixture überschreiben kann, die hier liegt:
main ← production_fixes
opened 03:54PM - 14 Dec 22 UTC
* FIX: all places where geolocation is formatted (+ add covering & first FE test… )
* FIX: failure to build
* IMPROVE: add CI workflow
* FIX: specs (out of date with latest Rails)
die ein zusätzliches Attribut enthält, das Site hat, wenn das Locations Plugin vorhanden ist.
… und es für den Rest des Tests beibehalten!
Der neue Test ist hier.
main ← production_fixes
opened 03:54PM - 14 Dec 22 UTC
* FIX: all places where geolocation is formatted (+ add covering & first FE test… )
* FIX: failure to build
* IMPROVE: add CI workflow
* FIX: specs (out of date with latest Rails)
Ich lade Site scheinbar erfolgreich mit der Fixture.
Ich stoppe an dieser Debugger-Stelle während des QUnit-Laufs im Browser und kann sagen, dass sie korrekt geladen ist:
test("user card location - shows correct format", async function (assert) {
const siteAttrs = {
...siteFixtures["site.json"].site,
};
PreloadStore.store("site", cloneJSON(siteAttrs));
Site.resetCurrent();
debugger;
PreloadStore.get("site")
aber wenn auf die Benutzerkarte geklickt wird, sind die Daten nicht wie erwartet und entscheidend ist, dass das Attribut country_codes fehlt, sodass der Test hier ins Stocken gerät:
if (user && user.geo_location) {
contents.push(iconNode('map-marker-alt'));
let format = this.siteSettings.location_user_profile_format.split('|');
let opts = {};
let userLocation;
if (format.length && format[0]) {
opts['geoAttrs'] = format;
userLocation = geoLocationFormat(user.geo_location, self.site.country_codes, opts);
} else {
userLocation = user.geo_location.address;
};
contents.push(h('div.location-label', userLocation));
if (this.siteSettings.location_user_profile_map) {
let mapContents = [];
let btnParams = {
Warum gehen meine überschriebenen Site-Daten verloren?
1 „Gefällt mir“
merefield
(Robert)
20. Dezember 2022 um 21:49
2
OK, das ist frustrierend.
Es sieht so aus, als ob der Wert des Site-Objekts hier gesetzt wird:
const clock = fakeTime(timeString, timezone, false);
try {
callback();
} finally {
clock.restore();
}
}
let _pretenderCallbacks = {};
export function resetSite(extras = {}) {
const siteAttrs = {
...siteFixtures["site.json"].site,
...extras,
};
PreloadStore.store("site", cloneJSON(siteAttrs));
Site.resetCurrent();
}
export function applyPretender(name, server, helper) {
Und kann nicht überschrieben werden?
Ich habe dies überprüft, indem ich die Fixture im Core geändert habe (hier: discourse/app/assets/javascripts/discourse/tests/fixtures/site-fixtures.js at 93a4012ecb3af7306de0c51283d6dd2b2e90818c · discourse/discourse · GitHub ) und es übernimmt meine Änderung.
Aber das will ich nicht, ich möchte es in meinem Plugin-Test mit einer Fixture überschreiben, die in meinem Plugin gespeichert ist.
Um es zu wiederholen: Ich kann das für den Geltungsbereich des Test_codes_ tun, aber sobald der Plugin-Code ausgeführt wird, scheint der Geltungsbereich das Site-Objekt zu übernehmen, das sich auf die vom Core-Testhelfer geladene Fixture bezieht …
merefield
(Robert)
28. Dezember 2022 um 21:57
3
Ich habe das endlich gelöst. Es stellte sich heraus, dass man needs genauso verwenden kann wie für andere Objekte:
Hinweis hier:
};
const needs = {
user(changes) {
loggedIn = true;
userChanges = changes;
},
pretender(fn) {
addPretenderCallback(name, fn);
},
site(changes) {
siteChanges = changes;
},
settings(changes) {
settingChanges = changes;
},
mobileView() {
mobileView = true;
},
};
Finaler Code:
needs.site(cloneJSON(siteFixtures["country_codes.json"]));
3 „Gefällt mir“
system
(system)
Geschlossen,
27. Januar 2023 um 21:58
4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.