是否可以在没有Rails的情况下使用FactoryGirl?

时间:2011-03-05 17:12:22

标签: ruby factory-bot

我正在创建一个与数据库交互的GUI应用程序,因此我需要对我的RSpec测试进行夹具管理。我使用sqlite数据库,我将编写一个将使用直接SQL操作数据的类。我需要测试它的数据库交互功能。

当我运行RSpec测试时,我找不到任何可以执行两项基本操作的库:

  1. 清除数据库或其中的特定表格
  2. 将特定数据加载到其中,以便我可以在我的测试中使用该数据
  3. 已经有成千上万的博客文章和手册清楚地解释了如何将FactoryGirl与任何版本的Rails一起使用,但没有一个没有它。我开始挖掘这就是我所拥有的(注意我不使用rails及其组件):

    spec/note_spec.rb:

    require 'spec_helper'
    require 'note'
    
    describe Note do
      it "should return body" do
        @note = Factory(:note)
        note.body.should == 'body of a note'
      end
    end
    

    spec/factories.rb:

    Factory.define :note do |f|
      f.body 'body of a note'
      f.title 'title of a note'
    end
    

    lib/note.rb:

    class Note
      attr_accessor :title, :body
    end
    

    当我运行rspec -c spec/note_spec.rb时,我得到了以下信息:

    F
    
    Failures:
    
      1) Note should return body
         Failure/Error: @note = Factory(:note)
         NoMethodError:
           undefined method `save!' for #<Note:0x8c33f18>
         # ./spec/note_spec.rb:6:in `block (2 levels) in <top (required)>'
    

    问题:

    1. 是否可以使用不带Rails的FactoryGirl和ActiveModel / ActiveRecord等Rails库?
    2. 我是否必须从特定类继承我的Note类,因为FactoryGirl正在寻找save!方法?
    3. 除FactoryGirl之外还有其他更可行的解决方案吗?
    4. 我是Ruby / RSpec / BDD的新手,所以我们将非常感谢任何帮助;)

1 个答案:

答案 0 :(得分:9)

默认情况下,factory_girl会创建已保存的实例。如果您不想将对象保存到数据库,则可以使用build方法创建未保存的实例。

require 'spec_helper'
require 'note'

describe Note do
  it "should return body" do
    @note = Factory.build(:note)
    note.body.should == 'body of a note'
  end
end

请参阅Getting Started file

中的“使用工厂”