如何使我的RSpec描述块彼此独立运行?

时间:2016-04-01 19:12:07

标签: ruby rspec capybara rspec-rails

在我的仪表板页面上,我有一个度量标准部分,其中显示了用户拥有的目标数。对于没有目标的用户,我不会显示此部分。当用户创建目标时,在重定向后,将显示“度量标准”部分。

在下面的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

1 个答案:

答案 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并将您的请求规范转换为功能规范。