与Capybara的Rails集成测试填写以前测试的值

时间:2012-01-20 22:57:19

标签: ruby-on-rails integration-testing capybara

我正在使用test / unit和capybara运行我对rails应用程序的测试。我对rails很陌生,所以我希望我错过了一些明显的东西。我有以下集成测试来填写单个字段并提交表单。这按预期工作,测试通过:

  test "create post with title only should add post" do
    assert_difference('Post.count') do
      visit '/posts/new'
      fill_in :title, :with => "Sample Post"
      click_button 'create Post'
    end

    assert current_path == post_path(Post.last)
    assert page.has_content?("Sample Post")
  end

我添加了第二个测试,它几乎复制了之前的测试,但也填写了第二个字段并检查了其他输入(这是失败的)。

  test "create post with title and body should add post" do
    assert_difference('Post.count') do
    visit '/posts/new'
      fill_in :title, :with => "Testing"
      fill_in :body, :with => "This is a sample post"
      save_and_open_page
      click_button 'create Post'
    end
    save_and_open_page
    assert current_path == post_path(Post.last)
    assert page.has_content?("Testing")
    assert page.has_content?("This is a sample post")
end

当失败时,我将呼叫添加到:

save_and_open_page

并发现表单中填写了上一次测试的标题值,并且根本没有提供正文值。测试的名称和断言与第二次测试匹配,因此这不是错误身份的情况。似乎Capybara没有获得更新的值。我的test_helper.rb文件中也有这段代码:

DatabaseCleaner.strategy = :truncation

module ActionController
  class IntegrationTest
    include Capybara::DSL

    self.use_transactional_fixtures = false

    teardown do
      DatabaseCleaner.clean
      Capybara.reset_sessions!
      Capybara.use_default_driver
    end
  end
end

我认为这应该清除测试之间的值。由于这显然没有发生,我也尝试添加一个对Capybara.rest_sessions的调用!在第一次测试结束时,这没有帮助。

非常感谢任何建议或帮助。

1 个答案:

答案 0 :(得分:4)

我明白了。我用符号:title而不是字段id的字符串调用fill方法。我需要使用' post_title'。我就这样开始了,但是没有为名称添加模型名称前缀,所以它没有被找到,当我改变为我在我的erb代码中使用的符号时,它开始工作。

所以使用:

fill_in 'post_title', :with => "whatever"

而不是

fill_in :title, :with => "whatever"