如何使用关注点和关联来测试模块,通过规范中的虚拟ActiveRecord模型

时间:2014-08-01 18:49:27

标签: ruby-on-rails ruby activerecord

使用虚拟活动记录类测试使用关联的模块的最佳方法是什么?

module Outputable
  extend ActiveSupport::Concern

  included do
    has_one :output, as: outputable
  end

  delegate :print, to: :output
end

要在课程中使用此模块,您需要创建一个新的ActiveRecord模型:

class Program < ActiveRecord::Base
  include Outputable

  def initialize(output)
    self.output = output
  end
end

prog = Program.create(Output.create)
prog.print("hello world") # delegates to Output.print

我希望能够使用几种类型的类,例如ProgramLog等。但是我还没有定义这些ActiveRecord模型,我想用假人测试规范中的类(类似于此SO question)。我已经尝试了Temping gem,但也许它已经过时了,使用Rails 4,Ruby 2.1.2我得到了:

尝试从DummyProgram.create(output)开始:

Temping.create :dummy_program do
  include Outputable

  def initialize(output)
    self.output = output
  end
end

describe Outputable
  let(:output) { Output.create }
  let(:prog) { DummyProgram.create(output) }

  it "exposes Output methods" do
    expect(output).to receive(:print)
    prog.print("hello world!")
  end
end

我为undefined method '[]' for nil:NilClass获得了一个奇怪的DummyProgram.create(output)方法。如果我DummyProgram.new(output),它的工作原理如何,但我需要将它保存到临时数据库中。

有没有人遇到过这种方法,或者替代temping gem?

更新:目前,我要手动创建和删除表格:

describe Outputable do
  let(:output) { Output.create }
  let(:prog) { DummyProgram.create(output: output) }

  class DummyProgram < ActiveRecord::Base
    include Workflows::Outputable
  end

  before :all do
    m = ActiveRecord::Migration.new
    m.verbose = false
    m.create_table :dummy_program do |t|
      t.integer :workflow_id
      t.string :workflow_type

      t.timestamps
    end
  end

  after :all do
    m = ActiveRecord::Migration.new
    m.verbose = false
    m.drop_table :dummy_program
  end

  ...
end

0 个答案:

没有答案