请求渲染文本的RSpec匹配器

时间:2015-10-28 12:52:02

标签: ruby-on-rails ruby ruby-on-rails-4 testing rspec

是否可以检查get是否请求呈现文本?

我知道有像response.body == 'any string'这样的黑客但我不感兴趣。我只是想知道是否有“RSpec™”的方法来做到这一点。

有了这个rspec:

RSpec.describe MyController, type: :controller do
  controller do
    def index
      render text: 'Hellow'
    end
  end

  describe 'rendering' do
    subject { get :index }
    it { is_expected.to render_template(text: 'Hellow')}
  end
end

我希望能够致电it { is_expected.to render_template(text: 'Hellow')}。它提出了:

 Failure/Error: it { is_expected.to render_template(text: 'Hellow') }
 ArgumentError:
   Unknown key: :text. Valid keys are: :layout, :partial, :locals, :count, :file

或者it { is_expected.to render_template('Hellow')}

 Failure/Error: it { is_expected.to render_template('Hellow') }
   expecting <"Hellow"> but rendering with <[]>

是否有任何RSpec™方法可以实现它?

1 个答案:

答案 0 :(得分:2)

测试expect(response.body).to eq('Hellow')是完全合适的。

is_expected.to render_template不起作用的原因是您没有渲染模板。如果您的控制器省略了明确的render调用,Rails会为您呈现index模板,您可以测试render_template(:index)。如果您想渲染非标准模板,也可以render template: :foo然后测试render_template(:foo)。但是当你render text: 'Hellow'时,你并没有使用模板;您已明确将响应正文设置为您指定的文本。

如果你确实渲染了一个模板,并且想要测试该模板渲染的内容,那么render_views开始时就是gotva mentioned。即使这样,您也可以检查response.body中的内容,正如您在RSpec自己的示例中所看到的那样。由于您的模板变得复杂,控制器规格并不适合这个,您应该开始使用assert_select或类似内容编写view specs