自从我们的测试套件从Minitest移到RSpec之后,我非常绝望。到目前为止,所有控制器和模型测试都运行良好,但是由于尝试移植(以前是通过/工作)特性测试,我遇到了麻烦.
feature 'Create place' do
scenario 'create valid place as user' do
login_as_user
visit '/places/new'
fill_in_valid_place_information
click_button('Create Place')
visit '/places'
expect(page).to have_content('Any place', count: 1)
end
...
def fill_in_valid_place_information
fill_in('place_name', with: 'Any place')
fill_in('place_street', with: 'Magdalenenstr.')
fill_in('place_house_number', with: '19')
fill_in('place_postal_code', with: '10963')
fill_in('place_city', with: 'Berlin')
fill_in('place_email', with: 'schnipp@schnapp.com')
fill_in('place_homepage', with: 'http://schnapp.com')
fill_in('place_phone', with: '03081763253')
end
end不幸的是,这不会导致DB提交,从而导致测试失败。如果我pry进入测试并手动创建请求的位置,它不会失败。为了触发按钮,我尝试了不同的方法,但到目前为止没有什么效果。
这就是我的rails_helper.rb的样子:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
require 'capybara/rspec'
require 'capybara/rails'
require 'capybara/poltergeist'
require 'pry'
def validate_captcha
fill_in 'captcha', with: SimpleCaptcha::SimpleCaptchaData.first.value
end
def login_as_user
user = create :user, email: 'user@example.com'
visit 'login/'
fill_in 'sessions_email', with: 'user@example.com'
fill_in 'sessions_password', with: 'secret'
click_on 'Login'
end
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, phantomjs_options: ['--ignore-ssl-errors=true'])
end
Capybara.javascript_driver = :poltergeist
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, no_transaction: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.include Capybara::DSL
config.include Rails.application.routes.url_helpers
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
end有人知道可能的原因吗?Gem版本:
最好的,谢谢,安迪
--更新
我加入了fill_in_valid_place_information方法
无论是否启用Capybara JS驱动程序,测试都是这样失败的(在这个测试的情况下,这不重要,因为这个特性不使用任何JS)。不幸的是,它并没有给出任何真正的线索来配合.
1) Create place create valid place as user
Failure/Error: expect(page).to have_content('Any place', count: 1)
expected to find text "Any place" 1 time but found 0 times in "KIEZ KARTE Find places Here comes a list of all POIs currently available in our database. If you are looking for a specific location please enter parts of its descriptive features into the 'Search' field. Search: Name Postal code Categories No data available in table"
Timeout reached while running a *waiting* Capybara finder...perhaps you wanted to return immediately? Use a non-waiting Capybara finder. More info: http://blog.codeship.com/faster-rails-tests?utm_source=gem_exception--更新2
我发现这个问题与辣椒无关。实际上,我忘记为我们正在调用的API传输存根响应。谢谢大家参加我的斗争!
发布于 2017-02-09 16:17:11
在您的测试中有许多潜在的问题可能导致您所看到的结果,如果您包含测试产生的实际错误消息,那么在将来更容易缩小范围。
Capybara.default_driver,但如果是,那么您的DatabaseCleaner配置是错误的Capybara.default_driver,并且使用:js/:驱动程序元数据使用模式,那么驱动程序名称检测就会工作。此外,后缀/后差对于减少测试不稳定也很重要。login_as_user方法需要在返回之前验证登录已完成。这是因为click_on 'Login'可以异步触发并在登录实际发生之前返回。这将导致您在中止登录后立即调用的visit,阻止发送会话cookie,并在您期望用户登录时出现非登录用户。要解决这个问题,你需要类似的东西
login_as_user ..。click_on ' login‘expect(页面).to have_text(’您现在登录了!‘)#在成功登录时显示的任何消息,或在页面上使用have_css和仅当用户登录时才存在的元素(用户菜单等)
在click_button('Create Place')和visit '/places'之间也存在同样的问题,访问可以有效地取消按钮单击的效果。https://stackoverflow.com/questions/42132014
复制相似问题