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
Что работает для этой спецификации - но будет ли это работать для других?