【问题标题】:Rails cucumber uninitialized constant User (NameError)Rails黄瓜未初始化常量用户(NameError)
【发布时间】:2020-04-04 17:29:07
【问题描述】:

我从 BDD (cucumber + capybara + selenium chromedriver) 和带有 factory_bot 的 TDD (rspec) 开始,我在 cucumber 功能上遇到错误 - step_definitions。

未初始化的常量用户(NameError)

使用 TDD,一切正常,工厂机器人工作正常。问题出在黄瓜上。

factories.rb

FactoryBot.define do

    factory :user_role do
        name {"Admin"}
        query_name {"admin"}
    end

    factory :user do
        id {1}
        first_name {"Mary"}
        last_name {"Jane"}
        email {"mary_jane@gmail.com"}
        password {"123"}
        user_role_id {1}
        created_at {'1/04/2020'}
    end
end

支持/env.rb

require 'capybara'
require 'capybara/cucumber'
require 'selenium-webdriver'
require 'factory_bot_rails'

Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.configure do |config|
    config.default_driver = :selenium
end

Capybara.javascript_driver = :chrome

World(FactoryBot::Syntax::Methods)

问题就发生在这里

support/hooks.rb

Before '@admin_login' do
    @user = create(:user)
end

step_definitions/admin_login.rb

Given("a registered user with the email {string} with password {string} exists") do |email, password|
    @user
end

我不知道为什么,但是我无法使用 cucumber 和 factory_bot 访问用户。

有人可以帮帮我吗?

我想我需要在黄瓜上配置一些东西。

你们怎么看?


【问题讨论】:

    标签: cucumber ruby-on-rails-5 bdd factory-bot


    【解决方案1】:

    首先,Luke 关于这是一个设置问题是正确的。该错误告诉您找不到 User 模型,这可能意味着 Rails 尚未加载。我不记得 cucumber-rails 如何工作的确切细节,但它所做的一件事是确保每个场景都成为 Rails 集成测试的扩展。这可确保所有 Rails 自动加载都已发生并且这些内容可用。

    其次,我建议您从更简单的开始并使用一个步骤来创建您的注册用户,而不是使用标签。使用标签进行设置是 Cucumber 的反模式。

    最后,更具争议性的是,我建议你不要在 cuking 时使用 factory-bot。 FactoryBot 使用单独的配置直接在数据存储中创建模型对象。这绕过了围绕创建这些对象的任何应用程序逻辑,这意味着 FactoryBot 创建的对象最终将与您的应用程序创建的对象不同。在现实生活中,对象创建涉及审核、发送电子邮件、条件逻辑等。要使用 FactoryBot,您要么必须复制额外的创建逻辑和行为,要么忽略它(这两种选择都是不可取的)。

    通过使用以下模式,您可以更有效(更快)地创建对象。

    Rails 控制器中的每个创建方法都将其工作委托给服务对象,例如

    UserController
      def create
        @user = CreateUserService.new(params).call
      end
    end
    

    然后让你的 cukes 使用辅助模块为你创建东西。该模块将为您提供使用上述服务创建用户的步骤的工具

    module UserStepHelper
      def create_user(params)
        CreateUserService.new(default_params.merge(params))
      end
    
      def default_params
        {
          ...
        }
      end
    end
    World UserStepHelper
    
    Given 'there is a registered user' do
      @registered_user = create_user
    end
    

    然后在您的功能背景中使用该步骤,例如

    Background: 
      Given there is a registered user
      And I am an admin
    
    Scenario: Admin can see registered users
      When I login and view users
      Then I should see a user
    

    请注意这里没有标记。它在这里是不可取或不必要的。

    您可以在我为 2013 年的 CukeUp 演讲所做的示例应用程序中看到此方法的扩展,这里是 https://github.com/diabolo/cuke_up/commits/master。如果您从底部的第一次提交开始按照此提交进行提交,那么您将获得一个很好的指南,以在前 4 或 4 次提交中使用 cucumber 设置 Rails 项目。如果您一直坚持到最后(22 次提交),您将获得一个基本的强大框架,用于在 cuking 时创建和使用模型对象。我意识到这个项目是古老的,显然你必须使用所有东西的现代版本,但原则仍然适用,我在所有工作中都使用这种方法,并且已经这样做了至少 10 年。

    【讨论】:

      【解决方案2】:

      因此,如果您使用的是 rails,可能建议您使用 cucumber-rails 而不是 cucumber。这可能是您的用户模型尚未自动加载的问题。

      Cucumber 自动加载功能下的所有 ruby​​ 文件,首先使用 env.rb,这几乎肯定是加载顺序/加载位置的问题

      【讨论】:

      • 我用 cucumber-rails 更新了我的 gemfile,但同样的错误:(
      • 尝试使用 cucumber-rails 从头开始​​一个单独的项目,并确保您运行安装后设置rails generate cucumber:install
      猜你喜欢
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2016-07-15
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多