【问题标题】:how to write/run specs for files other than model/view/controller如何为模型/视图/控制器以外的文件编写/运行规范
【发布时间】:2012-11-12 17:14:03
【问题描述】:

当我使用带有模型/视图/控制器的rails generate 命令时,使用 rails 和 rspec 很容易让 rspec 为我生成必要的文件。但现在我想为我编写的模块编写规范。该模块在/lib/my_module.rb 中,所以我在/spec/lib/my_module_spec.rb 中创建了一个规范

我遇到的问题是,当我尝试执行 rspec spec/ 时,文件 my_module_spec.rb 正在运行,但在 lib/my_module.rb 中找不到对我的模块的引用。这样做的正确方法是什么?

仅供参考,my_module_spec.rb 文件中确实已经包含 require 'spec_helper'

require 'spec_helper'

describe "my_module" do
  it "first test"
    result = MyModule.some_method  # fails here because it can't find MyModule
  end
end

【问题讨论】:

  • 您是否在 my_module_spec.rb 中包含该模块?能否提供出处?
  • @Jasper 我没有。但是当我使用模型/视图/控制器时,我也不必这样做。
  • 是否需要相关规范中的模块源文件? require "#{Rails.root}/lib/my_module.rb" 我遇到了与您所看到的类似的问题,这与下面 Jasper 的解决方案相结合,让我到达了我需要的地方。
  • @jaydel 很有趣,我希望有一种不那么手动的方法(类似于模型/控制器/视图),但我想情况并非如此。
  • @Brand 也许您没有在 application.rb 中包含 lib 文件夹?例如。 'config.autoload_paths

标签: ruby-on-rails ruby rspec


【解决方案1】:

您可以尝试包含该模块,也可以将其包装在一个对象中

require 'spec_helper'

#EDIT according to 
# http://stackoverflow.com/users/483040/jaydel
require "#{Rails.root}/lib/my_module.rb"

describe MyModule do

  let(:wrapper){
    class MyModuleWrapper
      include MyModule
    end
    MyModuleWrapper.new
  }

  it "#some_method" do
    wrapper.some_method.should == "something"
  end

end

【讨论】:

    【解决方案2】:

    您的模块是否包含类方法或实例方法?请记住,只有类方法可以通过

    MyModule.some_method
    

    意味着 some_method 被定义为

    def self.some_method
      ...
    end
    

    如果您的模块包含实例方法,则使用上面 Jasper 的解决方案。希望澄清。

    【讨论】:

      【解决方案3】:

      将以下内容放入您的 config/application.rb 文件中:

      config.autoload_paths += %W(#{Rails.root}/lib)
      

      我只是在努力解决同样的问题,以上内容对我有用。没有任何理由让您必须跳过障碍才能从 RSpec 访问您的 lib/ 文件并为它们编写测试。

      【讨论】:

        猜你喜欢
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多