<div data-theme-toc="true"> </div>
Escrever testes automatizados para temas é uma parte importante do processo de desenvolvimento de temas, pois pode ajudar a garantir que os recursos introduzidos por um tema continuem a funcionar bem ao longo do tempo com os recursos principais do Discourse.
Atualmente, o Discourse suporta duas maneiras de escrever testes de regressão para temas. A primeira segue principalmente a maneira do EmberJS e envolve apenas o teste do código do lado do cliente. A segunda maneira é escrever testes de sistema Rails, que permitem testar o código do lado do servidor e o código do lado do cliente ao mesmo tempo. Este documento se concentrará em escrever testes de sistema Rails para temas e é o que recomendamos que os autores de temas também se concentrem ao escrever testes para seus temas.
Testes de sistema Rails para temas
Por baixo dos panos, o Discourse usa os frameworks de teste RSpec e Capybara para executar testes de sistema Rails. Conhecimento básico sobre RSpec e Capybara é necessário para começar e recomendamos a leitura dos seguintes links antes de começar:
- GitHub - rspec/rspec-core: RSpec runner and formatters
- GitHub - teamcapybara/capybara: Acceptance test framework for web applications
Diretrizes e dicas para escrever testes de sistema de temas
Estas são algumas diretrizes a serem seguidas ao escrever testes de sistema:
-
Espera-se que os testes de sistema estejam localizados no diretório
spec/systemno diretório do tema. -
Espera-se que cada arquivo no diretório
spec/systemsiga o formato\u003cdescrição_do_teste_de_sistema\u003e_spec.rb. -
O bloco
describeRSpec de nível superior precisa ter os metadadossystem: truepresentes. Exemplo:RSpec.describe "Testing A Theme or Theme Component", system: true do it "displays the component" do ... end end -
Os métodos auxiliares
upload_themeeupload_theme_componentestão disponíveis e precisam ser chamados antes que os testes sejam executados. Exemplo:RSpec.describe "Testing A Theme or Theme Component", system: true do let!(:theme) do upload_theme end # ou `upload_theme_component` se o seu tema for um componente # # let!(:theme_component) do # upload_theme_component # end it "displays the component" do ... end end -
A configuração de um tema pode ser alterada no teste do sistema chamando o método
update_settingno objetothemee, em seguida, salvando o tema.Exemplo:
RSpec.describe "Testing A Theme", system: true do let!(:theme) do upload_theme end it "does not display the theme when the `should_render` theme setting is false" do theme.update_setting(:should_render, false) theme.save! expect(page).not_to have_css("#some-identifier") end end -
O Discourse usa o gem fabrication, que nos permite configurar facilmente os dados de teste de que precisamos para cada teste. A lista completa de fabricadores disponíveis no core do Discourse também pode ser usada no teste do sistema do tema.
Exemplo:
RSpec.describe "Testing A Theme", system: true do let!(:theme) do upload_theme end it "displays the theme" do user = Fabricate(:user) category = Fabricate(:category) topic = Fabricate(:topic) topic_2 = Fabricate(:topic, title: "This is topic number 2") ... end end -
Use o método auxiliar
sign_inpara testar contra diferentes perfis de usuário.Exemplo:
RSpec.describe "Testing A Theme", system: true do let!(:theme) do upload_theme end it "does not display the theme for a regular user" do user = Fabricate(:user) sign_in(user) ... end it "displays the theme for a staff user" do admin = Fabricate(:admin) sign_in(admin) ... end end -
Às vezes, você vai querer tornar a consulta e a inspeção de partes da página mais fáceis e reutilizáveis para seus testes de sistema. Para fazer isso, você pode usar o conceito de PageObjects, que você verá frequentemente no core.
Exemplo:
# frozen_string_literal: true module PageObjects module Components class MyCustomComponent < PageObjects::Components::Base COMPONENT_SELECTOR = ".my-custom-component" def click_action_button find("#{COMPONENT_SELECTOR} .action-button").click end def has_content?(content) has_css?("#{COMPONENT_SELECTOR} .content", text: content) end end end ende você pode então usá-lo importando-o com o
require_relativeintegrado do Ruby no topo do seu arquivo de teste de sistema.require_relative "page_objects/components/my_custom_component"
Executando testes de sistema de temas
Os testes de sistema de temas podem ser executados usando o rubygem CLI discourse_theme e podem ser instalados com estas instruções.
Depois que a CLI discourse_theme for instalada, você poderá executar todos os testes de sistema no diretório do seu tema executando o seguinte comando:
discourse_theme rspec .
Na primeira execução do comando rspec para um novo tema, você será perguntado se deseja executar os testes de sistema usando um ambiente de desenvolvimento Discourse local ou um contêiner Docker, que terá o ambiente de desenvolvimento configurado para você. A menos que você seja um desenvolvedor experiente de plugins ou temas do Discourse, recomendamos selecionar n e executar os testes usando um contêiner Docker, pois tudo funcionará imediatamente.
O comando discourse_theme rspec também suporta a execução de um único diretório de spec, arquivo e arquivo com números de linha.
discourse_theme rspec /path/to/theme/spec/system
discourse_theme rspec /path/to/theme/spec/system/my_system_spec.rb
discourse_theme rspec /path/to/theme/spec/system/my_system_spec.rb:12
Modo Headful
Por padrão, os testes de sistema de temas são executados usando o Google Chrome no modo headless. Este é um modo onde o navegador não renderiza nada na tela, permitindo que as execuções de teste terminem mais rapidamente. No entanto, muitas vezes é útil poder ver o que o teste de sistema que você escreveu está fazendo usando o Google Chrome no modo headful. Você pode habilitar este modo passando a opção --headful para o comando discourse_theme rspec.
discourse_theme rspec . --headful
O comando acima executará os testes de sistema em modo headful, onde a execução dos testes pode ser vista visualmente.
Você também pode pausar a execução do teste em seu caso de teste usando o método auxiliar pause_test, permitindo que você inspecione o estado atual da aplicação no navegador.
Exemplo:
RSpec.describe "Testing A Theme", system: true do
let!(:theme) do
upload_theme
end
it "displays the theme" do
visit("/")
click("#some-button")
pause_test
# ...
end
end
Este documento é versionado - sugira alterações no github.