在我的仪表板页面上,我有一个度量标准部分,其中显示了用户拥有的目标数。对于没有目标的用户,我不会显示此部分。当用户创建目标时,在重定向后,将显示“度量标准”部分。
在下面的RSpec测试中,当RSpec首先随机运行第一个describe
时,测试通过,因为它找不到指标部分。但是,当RSpec首先运行第二个describe
块时,第一个describe
块会失败,因为到那时重定向已经发生并且出现了度量标准部分。
如何确保每个块单独运行并通过?
describe "Dashboard Pages", :type => :request do
subject { page }
let(:user) { FactoryGirl.create(:user) }
before(:each) do
sign_in user
end
describe "After user signs in - No Goals added yet" do
it { is_expected.to have_title(full_title('Dashboard')) }
it { is_expected.to have_content('Signed in successfully')}
it "should not show the metrics section" do
expect(page).to_not have_css("div#metrics")
end
end
#
#Notice that this runs using the SELENIUM WebDriver
#
describe "After user signs in - Add a new Goal" do
it "should display the correct metrics in the dashboard", js: true do
click_link "Create Goal"
fill_in "Goal Name", :with=> "Goal - 1"
fill_in "Type a short text describing this goal:", :with => "A random goal!"
click_button "Save Goal"
end
end
end
答案 0 :(得分:2)
我认为您的问题是click_button "Save Goal"
发送的请求在该测试完成后到达服务器。 Capybara的Javascript驱动程序是异步的,不会等待它们发送给浏览器的命令完成。
让Capybara等待的常用方法是在您想要等待的命令完成时,期待页面上的某些内容。无论如何,这是一个好主意,因为最后一次测试并没有真正期望指标像它所说的那样显示。所以期待它们是:
it "should display the correct metrics in the dashboard", js: true do
click_link "Create Goal"
fill_in "Goal Name", :with=> "Goal - 1"
fill_in "Type a short text describing this goal:", :with => "A random goal!"
click_button "Save Goal"
expect(page).to have_css("div#metrics")
end
另外,请注意,目前的RSpec和Capybara不允许您在请求规范中使用Capybara。除非您因其他原因与旧版本绑定,否则我建议升级到当前的RSpec和Capybara并将您的请求规范转换为功能规范。