É possível sobrescrever o objeto Site com um fixture próprio durante testes Front End de um Plugin?

Estou trabalhando neste PR: FIX: presenting formatted location on User Card by merefield · Pull Request #73 · merefield/discourse-locations · GitHub

Estou tentando cobrir a alteração com um novo teste de Front End.

Mas o teste falha ao executar porque um atributo de dados necessário não está definido.

O problema que estou enfrentando é como substituir com sucesso os dados em Site por um fixture mantido aqui:

que contém um atributo adicional que Site possui quando o Plugin Locations está presente.

… e fazê-lo persistir para o resto do teste!

O novo teste está aqui.

Eu carrego Site com sucesso com o fixture, aparentemente.

Eu paro neste ponto de depuração durante a execução do qunit no navegador e posso dizer que ele está carregado corretamente:

  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")

image

mas quando o User Card é clicado, os dados não são o que você esperaria e, criticamente, o atributo country_codes está faltando, então o teste para aqui:

Por que meus dados de Site substituídos estão sendo perdidos?

1 curtida

OK, isso é frustrante.

Parece que o valor do objeto Site é definido aqui:

E não pode ser substituído?

Verifiquei isso modificando o fixture no core (aqui: discourse/app/assets/javascripts/discourse/tests/fixtures/site-fixtures.js at 93a4012ecb3af7306de0c51283d6dd2b2e90818c · discourse/discourse · GitHub) e ele capta minha modificação.

Mas eu não quero isso, quero substituí-lo no meu teste de plugin com um fixture armazenado no meu plugin.

Para reiterar, sou capaz de fazer isso para o escopo do código de teste, mas uma vez que o código do plugin esteja em execução, o escopo parece captar o objeto site que se relaciona ao fixture carregado pelo helper de teste do core…

:thinking:

Finalmente resolvi isso. Descobri que você pode usar needs assim como para outros objetos:

Pista aqui:

Código final:

  needs.site(cloneJSON(siteFixtures["country_codes.json"]));
3 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.