Как проверить страницу просмотра поиска с помощью rspec? - PullRequest
0 голосов
/ 17 февраля 2011
# encoding: utf-8
class UsersController < ApplicationController

  def index
    @search = User.search(params[:search])
    @users = @search.paginate :per_page => 20, :page => params[:page]
  end

end


<h2>User search</h2>
<%= form_for @search, :url => users_path, :html => { :method => :get } do |f| %>
#some form elements
<% end %>

<% @users.each do |user| %> 
# show user info
<% end %>

Теперь, как проверить представление с помощью rspec 2?

# encoding: utf-8
require 'spec_helper'

describe "users/index.html.erb" do
  before(:each) do

    ####@user = stub_model(User)
            ######User.stub!(:search).and_return(@post)
      How to mock? If not mock(or stubed), it will got a nil error when rspec test.


  end

  it "renders a list of users" do
    render

    rendered.should contain("User search")
  end
end

1 Ответ

0 голосов
/ 17 февраля 2011
it "renders a list of users" do
  assign(:search, stub_model(???)) # see note
  assign(:users, [stub_model(User)]
  render
  rendered.should contain("User search")
end

assign позволяет спецификации ссылаться на переменные экземпляра, которые ожидаются в обычном представлении.@users должен быть массивом, таким образом, в скобках.

Примечание: замените вопросительные знаки тем типом объекта, который возвращается из User.search.

EDIT

Ну, это сложнее, чем кажется на первый взгляд.Я не мог найти простой способ для макета объекта, который может отвечать на необходимые сообщения, чтобы эта спецификация прошла.Быстрый и грязный способ - просто использовать реальный объект:

it "renders a list of users" do
  assign(:search, User.search)
  assign(:users, [stub_model(User)]
  render
  rendered.should contain("User search")
end

Недостатком является то, что для работы требуется соединение с базой данных.Мы могли бы взломать наш собственный вспомогательный объект:

class MetaSearchTestHelper
  extend ActiveModel::Naming
  include ActiveModel::Conversion
  attr_accessor :model_name
  def initialize(options={})
    @model_name = options[:model_name] || nil
  end
  def singular
    @model_name ? @model_name.downcase : nil
  end
  def persisted?
    false
  end
end

it "renders a list of users" do
  assign(:search, MetaSearchTestHelper.new(:model_name=>"User")
  assign(:users, [stub_model(User)]
  render
  rendered.should contain("User search")
end

Что работает для этой спецификации - но будет ли это работать для других?

...