RSpec Ver testes: Como modificar parâmetros?
-
05-07-2019 - |
Pergunta
Eu estou tentando testar meus pontos de vista com RSpec. A visão particular que está a causar-me perturba muda sua aparência dependendo de um parâmetro url:
link_to "sort>name", model_path(:sort_by => 'name')
que resulta em http://mydomain/model?sort_by=name
Meu ponto de vista, em seguida, usa esse parâmetro assim:
<% if params[:sort_by] == 'name' %>
<div>Sorted by Name</div>
<% end %>
O RSpec parece com isso:
it "should tell the user the attribute for sorting order" do
#Problem: assign params[:sort_for] = 'name'
render "/groups/index.html.erb"
response.should have_tag("div", "Sorted by Name")
end
Eu gostaria de testar meu ponto de vista (sem controlador) em RSpec, mas eu não posso começar este parâmetro na minha variável params
. Tentei assign
em todos os sabores diferentes:
-
assign[:params] = {:sort_by => 'name'}
-
assign[:params][:sort_by] = 'name'
- ...
sem sucesso até agora. Toda idéia é apreciado.
Solução
Isso é porque você não deve estar usando params
em seus pontos de vista.
A melhor maneira que eu vejo para usar um ajudante.
<div>Sorted by <%= sorted_by %></div>
E, em um dos seus arquivos auxiliares
def sorted_by
params[:sorted_by].capitalize
end
Então você pode testar seus ajudantes muito facilmente (porque em testes ajudantes, você pode definir o pedido params
.
Outras dicas
Se o teste de controlador de um então seria
controller.stub!(:params).and_return {}
Se seu um teste ajudante então seria:
helper.stub!(:params).and_return {}
E o seu teste de vista de um seria:
view.stub!(:params).and_return {}
Se você receber aviso como abaixo.
Deprecation Warnings:
Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from /home/akbarbin/Documents/Office/projects/portfolio/spec/views/admin/waste_places/new.html.erb_spec.rb:7:in `block (2 levels) in <top (required)>'.
If you need more of the backtrace for any of these deprecations to
identify where to make the necessary changes, you can configure
`config.raise_errors_for_deprecations!`, and it will turn the
deprecation warnings into errors, giving you the full backtrace.
1 deprecation warning total
Finished in 4.86 seconds (files took 4.72 seconds to load)
Você pode transformá-lo em
allow(view).to receive(:params).and_return({sort_by: 'name'})
A maneira mais fácil é apenas para fazer isso:
helper.params = {:foo => '1', :bar => '2'}
Mas, em geral, é melhor ser mais integração-y e não valores "stub" quando é viável. Então, eu prefiro usar testes de controlador com integrate_views . Em seguida, você pode especificar seus parâmetros para o get , e teste que todo o fluxo de trabalhos, de enviar parâmetros para o controlador, para tê-los processado pelo controlador, e, finalmente, para renderização.
Eu também geralmente preferem retirar lógica de exibição para ajudantes, o que pode ser mais fácil de teste.
Por exemplo, digamos que eu tenho um ajudante chamado selection_list , que retorna um hash cuja chave "selected_preset" depende de params [: selected_preset] , e o padrão é 42 se um valor vazio é especificado para o param.
Aqui está um teste controlador onde nós temos chamado integrate_views (você poderia naturalmente fazer a mesma coisa com um teste de visão real, se você estiver em que).
describe '#show' do
describe 'selected_preset' do
it 'should default to 42 if no value was entered' do
get :show, :params => {:selected_preset => ''}
response.template.selection_list[:selected_preset].should == 42
Este teste de integração irá alertar-me se alguma parte dessa funcionalidade breaks. Mas eu também realmente gostaria de ter alguns unidade testes para me ajudar a milimétrica que quebra.
Vou começar por ter o ajudante usar uma variável de instância em vez de parâmetros que acessam diretamente. Eu vou mudar o código acima, adicionando uma única linha diretamente abaixo do get, como segue:
describe '#show' do
describe 'selected_preset' do
it 'should default to 42 if no value was entered' do
get :show, :params => {:selected_preset => ''}
assigns[:selected_preset].should == 42 # check instance variable is set
response.template.selection_list[:selected_preset].should == 42
Agora eu também pode facilmente executar um teste de unidade auxiliar:
describe MyHelper do
describe '#selection_list' do
it 'should include the selected preset' do
assigns[:selected_preset] = 3
helper.selection_list[:selected_preset].should == 3
Outro método de definição da vista Parâmetros:
controller.request.path_parameters[:some_param] = 'a value'