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.

Foi útil?

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'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top