如何在RSpec中包含几个模块?

时间:2014-07-17 07:06:24

标签: ruby-on-rails ruby rspec module code-organization

我不确定将几个模块包含在RSpec中的方法,所以让我来描述一下我的情况。

app/helpers下,我有两个包含帮助程序的文件,其中包含模块ApplicationHelperMailersHelper。虽然这些是我在视图和邮件中使用的视图助手,但我也在测试中使用了一些方法,所以它们必须在describe子句中可访问。

app/spec/mailers下我还有一个包含模块Helpers的文件。该模块包含仅在测试中使用的方法(主要是长期望的包装方法)。

此外,我还有以下代码:

class Helpers
  include Singleton
  include ActionView::Helpers::UrlHelper
  include ActionView::Helpers::NumberHelper
end

def helper
  Helper.instance
end

它的目的是在测试中使视图助手可用。目前,此代码位于包装器方法之前的Helper模块中,因为它们使用Helper.instance方法。

我有三个邮件,我想测试。那么如何在测试中使所有这些东西都可以访问?

选项1

在每个邮件程序规范中直接使用include,如下所示:

require 'spec_helper'

describe MyMailer do
  include ApplicationHelper
  include MailersHelper
  include Helpers
  ...
end

选项2

helpers.rb文件中,我这样做:

require 'spec_helper'

module Helpers
  include MailersHelper
  include ApplicationHelper
  ...

end

RSpec.configure { |c| c.include Helpers }

并在每个邮件程序规范中使用require_relative './helpers'

选项3

如上所述,但不是在ApplicationHelper中包含MailersHelperHelpers,而是执行此操作:

RSpec.configure do |c| 
  c.include Helpers
  c.include ApplicationHelper
  c.include MailersHelper
end

我很困惑的是:

  1. 我在单独的文件(helpers.rb)中执行RSpec.configure部分,我在邮件程序规范中require_relative。所以这意味着这些模块只能用于我的邮件规格,而不是整套服装,对吧? (如果我在spec_helper.rb中这样做的情况就是如此)。

  2. 组织方法的最佳做法是什么,它们不是视图助手,而是多个类(主要是控制器或邮件程序)之间共享的助手。如何命名,应该放在哪里?

  3. 持续自动加载对我来说真的是一个难题 - 有时你可以直接获得一个模块/类,而且你不需要做任何事情(但这可能取决于文件/模块的确切命名),有时候你必须require它或relative_require它,但你必须小心你在哪里做到这一点,因为否则它会变得全局可用,有时你有一种特殊的方式来包括RSpec.configure之类的东西......哦,男孩!

1 个答案:

答案 0 :(得分:4)

这应该在spec_helper.rb中完成。您可以有条件地include模块,具体取决于规格类型。

RSpec.configure do |config|
  config.include MailersHelper, type: :mailer
end

spec/mailers中的任何规范现在都会自动包含MailersHelper

您可以通过执行

手动触发此操作
RSpec.describe FooConstant, type: :mailer do
  # ... etc
end

如果规范不在spec/mailers中,但您希望将其视为一个。