我不确定将几个模块包含在RSpec中的方法,所以让我来描述一下我的情况。
在app/helpers
下,我有两个包含帮助程序的文件,其中包含模块ApplicationHelper
和MailersHelper
。虽然这些是我在视图和邮件中使用的视图助手,但我也在测试中使用了一些方法,所以它们必须在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
方法。
我有三个邮件,我想测试。那么如何在测试中使所有这些东西都可以访问?
在每个邮件程序规范中直接使用include,如下所示:
require 'spec_helper'
describe MyMailer do
include ApplicationHelper
include MailersHelper
include Helpers
...
end
在helpers.rb
文件中,我这样做:
require 'spec_helper'
module Helpers
include MailersHelper
include ApplicationHelper
...
end
RSpec.configure { |c| c.include Helpers }
并在每个邮件程序规范中使用require_relative './helpers'
如上所述,但不是在ApplicationHelper
中包含MailersHelper
和Helpers
,而是执行此操作:
RSpec.configure do |c|
c.include Helpers
c.include ApplicationHelper
c.include MailersHelper
end
我很困惑的是:
我在单独的文件(helpers.rb
)中执行RSpec.configure部分,我在邮件程序规范中require_relative
。所以这意味着这些模块只能用于我的邮件规格,而不是整套服装,对吧? (如果我在spec_helper.rb中这样做的情况就是如此)。
组织方法的最佳做法是什么,它们不是视图助手,而是多个类(主要是控制器或邮件程序)之间共享的助手。如何命名,应该放在哪里?
持续自动加载对我来说真的是一个难题 - 有时你可以直接获得一个模块/类,而且你不需要做任何事情(但这可能取决于文件/模块的确切命名),有时候你必须require
它或relative_require
它,但你必须小心你在哪里做到这一点,因为否则它会变得全局可用,有时你有一种特殊的方式来包括RSpec.configure之类的东西......哦,男孩!
答案 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
中,但您希望将其视为一个。