Rspec view тестирование с капибарой и рельсами3 - PullRequest
19 голосов
/ 16 января 2011

Мне очень нравится способ, которым RSpec может разделять контроллеры и представления тестов, но у меня есть некоторые проблемы с тем, чтобы заставить сопоставителей капибары работать в тесте представления.То, что я в основном пытаюсь достичь, это что-то вроде этого:

describe "some page" do
  it "should render with lots of stuff" do
    assign ..
    render
    rendered.should have_button ('Any button') #or any capybara matcher, really
  end
end

Я видел несколько постов в сети, показывающих, как настроить capybara и rails3 для плавной работы с тестами контроллера cucumber или rspec, но это не такдействительно то, что я хочу - это тестирование представлений на самом низком возможном уровне.

Также, если есть другой способ сделать это (не требующий большого количества пользовательского кода, потому что я знаю, что мог бы написать некоторые сопоставления, которые извлекают данныеселекторы из рендеринга с использованием нокогири или любого другого подходящего инструмента), что было бы тоже замечательно - использование капибары не является обязательным.

Ответы [ 7 ]

17 голосов
/ 05 августа 2011

Теперь есть возможность использовать устройства сопоставления Capybara (без багажа Webrat) при тестировании контроллеров (и представлений тоже).Я использую его так:

describe GlobalizeTranslationsController do

  render_views
  let(:page) { Capybara::Node::Simple.new(@response.body) }

  describe "PUT :update" do
    before do
      put :update
    end

    it "displays a flash notice" do
      page.should have_selector('p.notice')
    end

  end

end

Полный код:

Ссылки:

11 голосов
/ 10 марта 2011

Capybara в настоящее время не работает со спецификациями вида (есть планы сделать так, чтобы это работало в будущем).Самый простой ответ - просто добавить gem 'webrat' в Gemfile, и все готово.Возможно, у вас нет have_button, но у вас будет have_selector, have_tag и аналогичные.

Кстати: насколько я знаю, капибара и вебрат могут сосуществовать в одном проекте.

9 голосов
/ 11 ноября 2011

Чуть проще, чем ответ Павла, но суть та же;у меня работает с рельсами 3.1.0, rspec 2.6.0, капибара 1.1.1:

page = Capybara::Node::Simple.new( rendered )
page.should have_content( "blah" )
3 голосов
/ 21 марта 2013

Вы не можете вызывать методы капибары на rendered, это просто строка.Вы можете использовать строковый метод Capybara , чтобы обернуть rendered в узле Capybara.Затем вы можете вызвать методы Capybara на этом узле:

describe "some page" do
  it "should render with lots of stuff" do
    assign ..
    render
    Capybara.string(rendered).should have_button('Any button')
  end
end

Для получения дополнительной информации, проверьте этот пост:

http://www.tamingthemindmonkey.com/2011/11/07/capybara-matchers-and-scoping-in-view-specs

1 голос
/ 24 августа 2015

Обновление этого старого вопроса, поскольку все изменилось с тех пор, как было добавлено большинство других ответов:

Capybara теперь поддерживает спецификации вида (из коробки), и это задокументировано в основной ветке Capybara

Цитировать документы:

Наконец, поддерживаются соответствия Capybara в виде спецификации:

RSpec.describe "todos/show.html.erb", type: :view do
  it "displays the todo title" do
    assign :todo, Todo.new(title: "Buy milk")

    render

    expect(rendered).to have_css("header h1", text: "Buy milk")
  end
end

Их поддержка без дополнительного кода стиля let(:page), по-видимому, была добавлена ​​в более ранней версии. (У меня это работает в капибарах 2.4.4 и 2.2).
Также обратите внимание, что поддерживается только ограниченное подмножество сопоставителей; однако вы можете получить больше функциональности, используя Capybara.string ; например:

expect(Capybara.string(rendered).first('td')).to have_no_content 'Tom Riddle'
1 голос
/ 23 января 2011

В нижней части этой страницы, в разделе «Вебрат и Капибара», похоже, что Капибара не поддерживается для спецификаций вида rspec

http://relishapp.com/rspec/rspec-rails

0 голосов
/ 20 мая 2014

Вы также можете использовать синтаксис капибары

describe "some page" do 
  it 'should render hello with name' do
    assign(:user, double("User", first_name: "John"))
    render
    expect(rendered).to have_content("Hello John")
  end
end
...