Railstutorial (Майкл Хартл), Глава 10. Упражнение 2. Тест ленты с разрывами страниц

Я использовал следующее, чтобы написать тесты для упражнений 1 и 2 главы 10 в static_pages_spec.rb, и когда я получил эти другие тесты, я получил следующую ошибку:

  1) Static pages Home page for signed-in users should render the user's feed
     Failure/Error: page.should have_selector("li##{item.id}", text: item.content)
       expected css "li#1138" with text "Lorem ipsum" to return something
     # ./spec/requests/static_pages_spec.rb:25:in `block (5 levels) in <top (required)>'
     # ./spec/requests/static_pages_spec.rb:24:in `block (4 levels) in <top (required)>'

Судя по всему, тест line item.id как-то сломался, как только FactoryGirl создала более 30 микросообщений.

Вот static_pages_spec.rb:

  describe "Home page" do
    before { visit root_path }

    it { should have_selector('h1', text: 'Sample App') }
    it { should have_selector('title', text: full_title('')) }

    describe "for signed-in users" do
      let(:user) { FactoryGirl.create(:user) }
      before do
        31.times { FactoryGirl.create(:micropost, user: user) }
        sign_in user
        visit root_path
      end

      after { user.microposts.delete_all }

      it "should render the user's feed" do
        user.feed.each do |item|
          page.should have_selector("li##{item.id}", text: item.content)
        end
      end

      it "should have micropost count and pluralize" do
        page.should have_content('31 microposts')
      end

      it "should paginate after 31" do
        page.should have_selector('div.pagination')
      end
    end

  end

Вот мой фрагмент _feed_item.html.erb:

<li id="<%= feed_item.id %>">
  <%= link_to gravatar_for(feed_item.user), feed_item.user %>
  <span class="user">
    <%= link_to feed_item.user.name, feed_item.user %>
  </span>
  <span class="content"><%= feed_item.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(feed_item.created_at) %> ago.
  </span>
  <% if current_user?(feed_item.user) %>
    <%= link_to "delete", feed_item, method: :delete,
                                     data: { confirm: "You sure?" },
                                     title: feed_item.content %>
  <% end %>
</li>

person Nathan McKaskle    schedule 06.11.2012    source источник
comment
Я думаю, что это как-то связано с невозможностью увидеть следующую страницу. Потому что каждый раз он возвращается с очень высоким идентификатором позиции.   -  person Nathan McKaskle    schedule 06.11.2012


Ответы (2)


Я не знаю, актуально ли это, но я все равно опубликую это, чтобы это могло помочь другим.

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

Мое решение вашей проблемы, похожее на ваше, использует разбиение на страницы вместо диапазона

it "should render the user's feed" do
  user.feed.paginate(page: 1).each do |item|
    page.should have_selector("li##{item.id}", text: item.content)
  end
end
person Caduri Katzav    schedule 20.04.2013

Я исправил это, ограничив тест строки фида только проверкой первых 28 сообщений.

  it "should render the user's feed" do
    user.feed[1..28].each do |item|
      page.should have_selector("li##{item.id}", text: item.content)
    end
  end

Тем не менее, я не знаю, что это лучший способ исправить это.

person Nathan McKaskle    schedule 09.11.2012