所以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中,测试不会存在于虚拟app中。并且my_gem / test / test_helper.rb在那里编写,测试将在虚拟应用程序的上下文中运行,在../dummy/config/environment上启动。
我描述了这个,因为我认为很多人都不知道这个新的发电机,它设置得非常好。
但我的问题是,有没有人想过如何用rspec来做这件事呢?我曾尝试按照相同的原则DIY为rails specing中的rspec设置这样的东西,但我遇到了各种令人困惑的障碍,我希望也许别人已经弄明白了(或者有兴趣搞定它对我们其他人来说,嘿)。
答案 0 :(得分:93)
创建不带测试单元的插件,并指定虚拟应用程序的路径:
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
(或导致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:
答案 1 :(得分:21)
只需运行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
!