Teste do controlador RSpec - resposta em branco.body

103

Estou preso a um problema ao testar meus controladores com RSpec - a chamada response.body sempre retorna uma string vazia. No navegador, tudo é renderizado corretamente, e os testes de recursos do pepino parecem acertar, mas o RSpec falha todas as vezes.

Outras expectativas sobre o objeto de resposta, como response.should render_template('index') passar sem problemas.

Algum de vocês já encontrou esse problema antes? Talvez a resposta html possa ser obtida de alguma outra forma?

Quanto às versões, Rails 2.1.0, RSpec 1.2.7.

Toms Mikoss
fonte

Respostas:

194

Por padrão, rspec-rails hackeia o Rails para impedi- lo de realmente renderizar templates de visão. Você deve apenas testar o comportamento de suas ações e filtros, seus testes de controlador, não o resultado da renderização do template - é para isso que servem as especificações de visão.

No entanto, se você deseja fazer com que as especificações do controlador renderizem os modelos como o aplicativo faria normalmente, use a render_viewsdiretiva:

describe YourController do
  render_views
  ...
end
mislav
fonte
2
Obrigado, exatamente o que eu precisava.
Toms Mikoss
2
Trabalho com Rails há anos e agora finalmente entendo a diferença entre as especificações do controlador e do pedido. Obrigado!
Brian Underwood de
2

Como eu trabalhava com um problema semelhante (que me levou a esta questão), me ocorreu que existem diferentes maneiras de tirar a pele do mesmo gato. Em outras palavras, em vez de verificar o corpo do texto, você pode verificar o conteúdo do flash.

response.body.should =~ /Invalid email or password/

pode ser um cheque equivalente a:

flash[:alert].should == "Invalid email or password"

Para mim, este último parece um pouco mais flexível, pois funcionará de qualquer maneira, mas pode não ser apropriado em todos os casos.

Felicidades,

John

John Lockwood
fonte
2

Por padrão, a configuração RSpec-rails desativa a renderização de modelos para especificações de controlador

Uma das maneiras de corrigir isso é habilitar a render_viewsconfiguração em seu rails_helper.rbarquivo. Desta forma, você o torna capaz de trabalhar globalmente em todos os seus testes.

RSpec.configure do |config|
  config.render_views
end

Ou use a declaração render_views para um grupo individual:

describe User do
  render_views
end

Você pode ler mais sobre isso aqui .

Nesha Zoric
fonte