我正在使用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的调用!在第一次测试结束时,这没有帮助。
非常感谢任何建议或帮助。
答案 0 :(得分:4)
我明白了。我用符号:title而不是字段id的字符串调用fill方法。我需要使用' post_title'。我就这样开始了,但是没有为名称添加模型名称前缀,所以它没有被找到,当我改变为我在我的erb代码中使用的符号时,它开始工作。
所以使用:
fill_in 'post_title', :with => "whatever"
而不是
fill_in :title, :with => "whatever"