我已经阅读了The Basics Of Creating Rails Plugins和其他几篇文章,但我找不到如何为宝石提供模型。
说,我想制作一个标记宝石(是的,我知道acts_as_taggable_on宝石,我需要不同的功能)。所以,我希望模型Tag
捆绑在gem中。我找不到解释这个的教程。
当然我试图对acts_as_taggable_on gem进行逆向工程以了解它是如何工作的,但它带来了更多的混乱:我上面提到的教程说我应该在我的宝石中有一个虚拟应用程序,以便测试宝石。但是,acts_as_taggable_on没有这样的虚拟应用程序!那么如何测试呢?
关于模型:好的,我看到文件lib/acts_as_taggable_on/tag.rb
似乎是Tag
模型:
module ActsAsTaggableOn
class Tag < ::ActiveRecord::Base
# ..........................
end
end
我发现文件lib/acts-as-taggable-on.rb
需要tag
:
require "acts_as_taggable_on/tag"
所以我应用了相同的方法(假设我的插件名为dftags):
我添加了文件lib/dftags/tag.rb
:
module Dftags
class Tag < ::ActiveRecord::Base
# attr_accessible :title, :body
end
end
我的lib/dftags.rb
看起来像这样:
module Dftags
end
require "dftags/tag"
我有规格tag_spec.rb
:
require 'spec_helper'
describe Tag do
let(:tag) { Tag.new(name: "") }
it { should validate_presence_of :name }
end
当我运行bundle exec rspec spec/
时,我收到错误unitialized constant Tag (NameError)
。
似乎我错过了重要的事情。另外,我还有用于测试的虚拟应用程序,但acts_as_taggable_on没有;所以,测试方法应该是不同的..
所以,问题:
答案 0 :(得分:2)
如何在没有虚拟应用的情况下测试我的宝石?
虚拟应用程序只是一个帮助程序,允许您在构建gem /插件时使用正常的rails测试工作流程。你可以在没有虚拟应用程序的情况下运行测试,但是你需要更多的手动工作。
acts_as_taggable_on
几乎只有active_record
,只有一个帮助者(据我所知,从快速浏览一下)。因此,作者认为维护虚拟应用程序的开销不值得付出努力,并且手动设置active_record
。请参阅此处https://github.com/mbleigh/acts-as-taggable-on/blob/master/spec/spec_helper.rb#L24他如何建立与数据库的连接。
当使用虚拟应用程序时,此代码不是必需的,因为rails正在处理它。
帮助者也是如此。他没有使用rails提供的测试方法,而是创建了一个包含帮助程序的新类,并使用该类的实例对其进行测试(h / acts-as-taggable-on / blob / master / spec / acts_as_taggable_on / tags_helper_spec.rb #L11)。