rails:如何使用gem提供模型,以及如何在没有虚拟app的情况下测试rails gem

时间:2014-01-05 09:54:40

标签: ruby-on-rails rspec gem

我已经阅读了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没有;所以,测试方法应该是不同的..

所以,问题:

  • 如何提供带宝石的模型?
  • 如何在没有虚拟应用程序的情况下测试我的宝石?
  • 是否有一些关于编写rails gem的高级文档?实际上我试图查看另一个着名的宝石:devise,但作者的ruby-fu和rails-fu太强大了,我无法理解它。人们在哪里学到所有这些?

1 个答案:

答案 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)。