Rails 3.1 插件 gem、虚拟测试应用程序、rspec

Posted

技术标签:

【中文标题】Rails 3.1 插件 gem、虚拟测试应用程序、rspec【英文标题】:Rails 3.1 plugin gem, dummy test app, rspec 【发布时间】:2012-01-20 10:09:38 【问题描述】:

所以 Rails 3.1 附带了一个鲜为人知的方便的“rails g plugin new”生成器,它为您提供了一个适用于 rails gem 插件的框架。 [http://guides.rubyonrails.org/plugins.html#or-generate-a-gemified-plugin]

这样做的其中一个有用的事情是,可以方便地使用 Test::Unit 进行测试。它为您提供了一个基本的虚拟 Rails 应用程序,您的测试可以在其上下文中运行,以测试仅在 Rails 应用程序副本中起作用的“引擎”行为。 (它把它放在 ./test/dummy 中)。但是您的测试仍在 my_gem/test 中,测试不在虚拟应用程序中。并且 my_gem/test/test_helper.rb 在那里,这样编写的测试将在虚拟应用程序的上下文中运行,并在 ../dummy/config/environment 引导。

我之所以这样描述,是因为我认为很多人不知道这个新的生成器,它的设置非常好。

但我的问题是,有没有人想出如何用 rspec 来代替?我尝试遵循相同的 DIY 原则,在 rails 插件 gem 中为 rspec 设置这样的东西,但是遇到了各种令人困惑的障碍,我希望也许其他人已经弄清楚了(或者有兴趣弄清楚它为我们其他人出去,呵呵)。

【问题讨论】:

【参考方案1】:

创建没有测试单元的插件并指定虚拟应用程序的路径:

rails plugin new foobar --skip-test-unit --dummy-path=spec/dummy

将 rspec-rails 作为开发依赖项添加到 gemspec 文件 (foobar.gemspec):

Gem::Specification.new do |s|
  .
  .
  .
  s.add_development_dependency "rspec-rails"
end

运行bundle install

创建一个从虚拟应用到插件规范目录的符号链接并运行 Rspec 安装生成器:

cd spec/dummy
ln -s ../../spec
rails generate rspec:install
cd -

现在编辑 spec/spec_helper.rb(或 rails 4+ 中的 spec/rails_helper.rb,不确定旧版本)更改此行(第 3 行):

require File.expand_path("../../config/environment", __FILE__)

到这里:

require File.expand_path("../dummy/config/environment", __FILE__)

现在您可以从插件的根目录运行 Rspec,它也会从虚拟应用程序中获取规范。

bundle exec rspec spec

我对此进行了更详细的介绍,展示了如何在带有虚拟应用程序的 rails 插件中设置 capybara、spork 和 guard:

https://web.archive.org/web/20130125091106/http://namick.tumblr.com/post/17663752365/how-to-create-a-gemified-plugin-with-rails-3-2-rspec

【讨论】:

对我来说,行:require File.expand_path("../../config/environment", __FILE__) 位于spec/rails_helper.rb 而不是spec/spec_helper.rb。这是因为 Rspec 发生了变化吗? 如果您将虚拟文件夹保留在 spec/ 中,则 rspec 将找到您的 spec 文件两次。第一次是 gem,第二次是 rails 应用程序,因为那里的模式将匹配所有规范文件,关于它们是否在符号链接下。 --exclude-pattern 似乎只能与 --pattern 一起使用。 config.pattern << ',!spec/dummy' 和类似的似乎也不起作用似乎解决这种情况的唯一解决方案是在规范文件夹之外有虚拟文件夹 tumblr 文章的链接实际上已损坏...@nathan-amick 您是否将其上传到其他地方? 从 Rails 5(2017 年 5 月 2 日)开始,我相信标志是 --skip-test 而不是 --skip-test-unit @max - 我遇到了同样的问题。但是,我能够让它与--exclude-pattern "spec/dummy/spec/**/*_spec.rb" 一起工作。您还可以将该行直接添加到您的.rspec 文件中,这样您就不必每次都输入它。我在 Rails 5 中使用rspec 3.5.2【参考方案2】:

只需运行rails plugin new <gemname>,然后将 rspec 作为 development_dependency 添加到 gemspec 文件中,然后安装它rspec --init

现在将虚拟子文件夹从test 移动到spec 并将这些添加到spec_helper

ENV["RAILS_ENV"] = "test"

require File.expand_path("../dummy/config/environment.rb",  __FILE__)
require "rails/test_help"
require '<gemname>'

Rails.backtrace_cleaner.remove_silencers!

因为他们在test_helper

【讨论】:

这对我来说效果很好,比其他答案简单得多

以上是关于Rails 3.1 插件 gem、虚拟测试应用程序、rspec的主要内容,如果未能解决你的问题,请参考以下文章

我应该为在 CouchDB 上运行的 Rails 3 使用哪个身份验证 gem/插件?

设置 RSpec 以测试 gem(不是 Rails)

是否有 Ruby on Rails 的分析 gem/插件?

Rails 中的电子邮件确认,无需使用任何现有的身份验证 gem/插件

Rails 3.1 - Coffescript 无法编译为 js

Ruby on Rails 的社交媒体共享按钮 Gem