首页 > 解决方案 > 包括来自黄瓜内部 rspec 的共享示例

问题描述

最终目标是包含在 rails_helper.rb 中的 shared_examples.rb。shared_examples.rb 是该文件的副本

https://github.com/tinfoil/devise-two-factor/blob/master/lib/devise_two_factor/spec_helpers/two_factor_authenticable_shared_examples.rb

我想在我的黄瓜测试中引用 shared_examples.rb 以便我可以使用该方法it_behaves_like 'two_factor_authenticatable'

我有以下文件夹结构:

更新以包含 @morissetcl 建议的结构

features
    step_definitions
        sample_step.rb
    support
        env.rb
    sample.feature

spec
    models
        user_spec.rb
    support
        shared_examples
            shared_example.rb
    rails_helper.rb
    spec_helper.rb

features 和 spec 文件夹都位于我的 rails 项目的根目录中。

我试图将位于 spec 文件夹中的 rails_helper.rb 包含在 sample_step.rb 文件中。

我尝试在 sample_step.rb 文件中使用不同类型的 require ,如下所示。

需要'spec/spec_helpers/shared_examples'

需要'../../spec/spec_helpers/shared_examples'

require_relative '../../spec/spec_helpers/shared_examples'

我不断收到以下错误

undefined method `it_behaves_like' for main:Object (NoMethodError)

标签: rubycucumberruby-on-rails-5rspec-rails

解决方案


it_behaves_like是 rspec 特定的。它的作用是允许一个规范为特定对象运行另一个规范,因此这在 Cucumber 中不起作用。

您需要做的是拥有一个包含一些杯子和一些规格的测试套件。您在 rspec 中详细介绍了两个因素身份验证,如果您必须始终使用两个因素身份验证来登录您的 cukes,您需要编写一个辅助方法以便您可以做到这一点。

为此,我将执行以下操作

  1. 编写一些步骤定义来支持登录,将工作委托给辅助方法。

  2. 编写辅助方法

  3. 让辅助方法调用其他方法以支持两个因素身份验证

  4. 将辅助方法添加到黄瓜的世界对象,以便可以在步骤 def 中调用它们

所以

# features/step_defintions/login
module LoginStepHelper
  def login(user: )
    login_fill_form_and_submit(user: user)
    login_two_factor(user: user)
    submit_form

  end

  def login_fill_form_and_submit(user: )
    fill_in :email, user.email
    fill_in :password, user.password
  end

  def login_two_factor(user: )
    code = retrieve_2factor_code(user: user)
    fill_in :2factor, code
  end

  ...

end
World(LoginStepHeler)

所以现在你必须弄清楚测试如何获得 2factor 代码。完成此操作后,您就有了一个工具,您的步骤定义可用于登录,因此您可以编写如下内容

Given 'I am logged in' do
  login user: @i
end

Given 'I login as Fred' do
  login user: @fred
end

...

注意:有多少步骤定义可以使用您的辅助方法。

您可以在此处找到有关此方法的更多详细信息https://github.com/diabolo/cuke_up其中包括有关如何创建我们在上述代码中传递给登录函数的测试用户的详细信息


推荐阅读