我有views/board_games/index.html.haml
.row
%ul
= render @board_games
这是我的views/board_games/_board_games.html.haml
%li
%a{href: board_game_path(board_game.id) }
%h5.text-center
%strong
= board_game.name
%img.image-center{ src: board_game.image_url }
在我的规格中我有
require 'spec_helper'
describe "Board Game Pages" do
subject { page }
describe "Index page" do
let(:bg1) { FactoryGirl.create(:board_game) }
let(:bg2) { FactoryGirl.create(:board_game) }
before { visit board_games_path }
it { should have_content(bg1.name) }
it { should have_content(bg2.name) }
end
end
即使我可以在实际页面上看到内容,此测试也无法通过。我已经确定它不遵循= render @board_games
。如何让capybara / rspec找到那里的内容。
答案 0 :(得分:1)
原因是let
。
let
很懒。在你打电话之前它不会做任何事情。在您的情况下,您实际上在期望中调用了let
定义的方法。那时,let
为你创建了记录,但是在渲染视图时已经很晚了,所以没有要显示的记录。
解决方法是使用let!
代替let
,如果你想在db中保留一些内容。
let!(:bg1) { FactoryGirl.create(:board_game) }
答案 1 :(得分:0)
你可能没有在那里使用Capybara。您可能正在使用“模拟服务器”模式,其中RSpec仅遵循路由并执行与真实Web服务器相同的服务器端操作。
(如果你是,你不应该,因为没有高级JS Capybara是浪费时间。)
如果您确实不使用Capybara,请启用render_views
,这样RSpec就不会删除实际的模板渲染步骤。