Capybara和Factorybot - 未显示创建的数据

时间:2018-02-13 07:20:07

标签: ruby-on-rails ruby rspec capybara factory-bot

我正面临有线问题,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 

3 个答案:

答案 0 :(得分:1)

当发生这种情况时,它通常由少数事情之一引起

  1. 记录实际上并未创建

    从您的代码来看,它似乎不是

  2. 当应用程序在不同的事务中运行时,正在一个事务中创建记录。

    您似乎正确配置了database_cleaner,这不应该是您的问题,但是您应该使用 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example - 而不是您拥有的配置(取决于:js)元数据,而不是检查实际使用的是哪个驱动程序)

  3. 用户已将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

  4. 这一切都在说,因为您不再需要使用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