我正面临有线问题,factoryBot正在Db中创建一条记录,但当capybara尝试访问它时,HTML中没有记录。
当我说时,我尝试用“byebug”进行调试 @topics =>它给了我Nil数据。 (@topic是topics_controller.rb中的实例变量 - >索引方法)
如果我执行“Topic.all.first”,它会显示正确的主题记录,其中包含预期的随机名称 - > “玩具与花园” 如果我做“random_topic.name” - > “玩具与花园”
我在其他功能上有一些类似的设置,即“帐户创建功能”,它在那里工作正常。任何指针或帮助都将受到高度赞赏。
我的工厂文件是
FactoryBot.define do
factory :topic do
name { Faker::Commerce.department(2, true) }
archived false
end
end
我的功能规范文件如下所示
require 'rails_helper'
describe "topics" do
let(:user) {create(:user)}
before do
sign_user_in(user) #support fuction to sign user in
end
it "allows topics to be edited" do
random_topic = create(:topic)
visit topics_path # /topics/
expect(page).to have_text random_topic.name # Error1
click_edit_topic_button random_topic.name # Another support fuction
random_topic_name_2 = Faker::Commerce.department(2, true)
fill_in "Name", with: random_topic_name_2
check "Archived"
click_button "Update Topic"
expect(page).to have_text "Topic updated!"
expect(page).to have_text random_topic_name_2
end
end
我在标记为“错误1”的行上收到错误,请注意“Toys& Garden”是Faker Gem生成的示例名称。
Failure/Error: expect(page).to have_text random_topic.name
expected #has_text?("Toys & Garden") to return true, got false
我的Rails助手(rails_helper.rb)文件设置如下。
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
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 'rspec/rails'
require 'database_cleaner'
require 'capybara/rspec'
require 'shoulda/matchers'
require 'email_spec'
require "email_spec/rspec"
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
# This is for setting up Capybara right host.
# https://stackoverflow.com/questions/6536503/capybara-with-subdomains-default-host
def set_host (host)
default_url_options[:host] = host
Capybara.app_host = "http://" + host
end
RSpec.configure do |config|
config.include Capybara::DSL
config.include Rails.application.routes.url_helpers
config.include FactoryBot::Syntax::Methods
config.include EmailSpec::Helpers
config.include EmailSpec::Matchers
config.order = "random"
config.use_transactional_fixtures = false
config.before(:each) do
set_host "lvh.me:3000"
end
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
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
end
我的主题控制器文件如下所示
class TopicsController < ApplicationController
layout 'dashboard'
before_action :authenticate_user!
def index
@topics = Topic.all
end
end
更新了@ smallbutton.com评论,但问题还在继续。
已解决
我正在使用公寓宝石,因此主题是在公共架构中创建的,而测试正在调查相应的租户。
根据@thomas的建议,我修改了代码:
before do
set_subdomain(account.subdomain)
sign_user_in(user) #support fuction to sign user in
Apartment::Tenant.switch!(account.subdomain)
end
答案 0 :(得分:1)
当发生这种情况时,它通常由少数事情之一引起
记录实际上并未创建
从您的代码来看,它似乎不是
当应用程序在不同的事务中运行时,正在一个事务中创建记录。
您似乎正确配置了database_cleaner,这不应该是您的问题,但是您应该使用 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example - 而不是您拥有的配置(取决于:js)元数据,而不是检查实际使用的是哪个驱动程序)
用户已将Capybara配置为使用与测试实际运行的服务器不同的服务器。
此处我们似乎遇到了问题,因为您要将Capybara.app_host
配置为&#39; lvh.me:3000&#39;。端口3000是您的开发应用程序通常运行的,而Capybara(默认情况下)在随机端口上启动您的应用程序进行测试。这可能意味着您的测试实际上是针对您的dev app / db实例运行的,这与测试app / db实例无关,因此测试不会看到您在测试中创建的任何内容。删除Capybara.app_host
的设置,除非您确实需要其设置(在这种情况下,从app_host设置中删除端口并启用Capybara.always_include_server_port
)
这一切都在说,因为您不再需要使用Rails 5.1+ database_cleaner了。你应该能够删除所有的database_cleaner,重新启用use_transactional_fixtures
,并设置Capybara.server = :puma
并使事情正常(仍然需要修复app_host设置)
答案 1 :(得分:0)
您应该在访问该页面之前创建该记录。目前你反过来这样做,所以你的记录不会出现。
答案 2 :(得分:0)
当您访问该页面时,您的记录不会被保留,因此返回 false 是正常的。
尝试以下方法:
require 'rails_helper'
describe "topics" do
let(:user) {create(:user)}
let!(:random_topic) {create(:topic)}
before do
sign_user_in(user) #support fuction to sign user in
visit topics_path # /topics/
end
it "allows topics to be edited" do
expect(page).to have_text random_topic.name # Error1
click_edit_topic_button random_topic.name # Another support fuction
random_topic_name_2 = Faker::Commerce.department(2, true)
fill_in "Name", with: random_topic_name_2
check "Archived"
click_button "Update Topic"
expect(page).to have_text "Topic updated!"
expect(page).to have_text random_topic_name_2
end
end
请注意 random_topic 是在 let!中提取的(有关 let 和 let!之间区别的更多信息>:https://relishapp.com/rspec/rspec-core/v/2-5/docs/helper-methods/let-and-let!