Comportamento estranho no QUnit?: teste falhando pois o valor definido não persiste

Tenho um problema estranho com o QUnit.

Este teste é extremamente simples e deveria ser direto… mas…

Uma configuração de plugin está mudando das que configurei.

Quando o Javascript é executado como resultado do carregamento do Composer, o valor da configuração definido anteriormente no bloco de aceitação não é mais o mesmo!

Deveria ser “user” como definido no código do teste, mas se registrado no console, é isso que vejo, e por que o teste falha:

Estou fazendo algo estúpido aqui? Por que o valor de location_topic_default está mudando de user para none?

Por favor, observe o padrão:

O escopo de needs.settings está presumivelmente correto aqui?

É quase como se os needs.settings estivessem sendo executados fora de ordem e além do escopo acceptance

2 curtidas

Eu testei isso localmente. Parece que há alguns fatores em jogo:

O objeto siteSettings ao qual você está se referindo é obtido pelo inicializador e, em seguida, usado em uma chamada modifyClass:

Os inicializadores são executados novamente para cada teste. O problema é que não temos como “reiniciar” quaisquer chamadas modifyClass que foram feitas por testes anteriores. Nossa solução é o parâmetro pluginId - isso significa que apenas a primeira chamada modifyClass em toda a suíte de testes é realmente usada. Chamadas para modifyClass de inicializadores em testes futuros são ignoradas.

Normalmente, isso é bom - o código dentro de uma invocação modifyClass não tende a mudar em cada execução de teste. No entanto, neste caso, você está referenciando a referência siteSettings do escopo dos inicializadores.

O tl;dr aqui é: em testes, essa implementação significa que o modifyClass ficará preso com as configurações do site daquele teste que foi o primeiro a ser executado.

A solução é usar uma referência siteSettings “em tempo de execução” em vez de “tempo de inicializador”. Podemos usar a do próprio model:composer. Esta diferença faz com que os testes passem para mim:

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 &&
2 curtidas

David, muito obrigado! Isso é uma armadilha e tanto!

1 curtida

David,

FYI

Há outro problema aqui que suspeito ser pela mesma razão:

currentUser também é definido no inicializador.

Se o teste errado for executado em segundo lugar, isso é avaliado e não está mais definido, então os testes quando executados juntos podem falhar “metade” do tempo.

Acho que o modelo Composer tem user, então mudarei para ele…

2 curtidas

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