merefield
(Robert)
16 Diciembre, 2022 18:32
1
Estoy trabajando actualmente en esta PR: FIX: presenting formatted location on User Card by merefield · Pull Request #73 · merefield/discourse-locations · GitHub
Estoy intentando cubrir el cambio con una nueva prueba de Front End.
Pero la prueba falla al ejecutarse porque falta un atributo de datos requerido.
El problema que enfrento es cómo anular con éxito los datos dentro de Site con un fixture que se encuentra aquí:
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)
que contiene un atributo adicional que Site tiene cuando el Plugin de Ubicaciones está presente.
… ¡y hacer que persista durante el resto de la prueba!
La nueva prueba está aquí.
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)
Logro cargar Site con el fixture, aparentemente.
Me detengo en este punto del depurador durante la ejecución de qunit en el navegador y puedo decir que se carga correctamente:
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")
pero cuando se hace clic en la Tarjeta de Usuario, los datos no son los que esperarías y, críticamente, falta el atributo country_codes, por lo que la prueba se detiene aquí:
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 = {
¿Por qué se pierden mis datos de Site anulados?
1 me gusta
merefield
(Robert)
20 Diciembre, 2022 21:49
2
OK, esto es frustrante.
Parece que el valor del objeto Site se establece aquí:
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) {
¿Y no se puede anular?
Lo he comprobado modificando el fixture en el núcleo (aquí: discourse/app/assets/javascripts/discourse/tests/fixtures/site-fixtures.js at 93a4012ecb3af7306de0c51283d6dd2b2e90818c · discourse/discourse · GitHub ) y recoge mi modificación.
Pero no quiero eso, quiero anularlo en la prueba de mi plugin con un fixture almacenado en mi plugin.
Para reiterar, puedo hacerlo para el alcance del código de la prueba, pero una vez que el código del plugin se está ejecutando, el alcance parece recoger el objeto del sitio que se relaciona con el fixture cargado por el ayudante de prueba del núcleo…
merefield
(Robert)
28 Diciembre, 2022 21:57
3
Finalmente resolví esto. Descubrí que puedes usar needs al igual que para otros objetos:
Pista aquí:
};
const needs = {
user(changes) {
loggedIn = true;
userChanges = changes;
},
pretender(fn) {
addPretenderCallback(name, fn);
},
site(changes) {
siteChanges = changes;
},
settings(changes) {
settingChanges = changes;
},
mobileView() {
mobileView = true;
},
};
Código final:
needs.site(cloneJSON(siteFixtures["country_codes.json"]));
3 Me gusta
system
(system)
Cerrado
27 Enero, 2023 21:58
4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.