使用虚拟活动记录类测试使用关联的模块的最佳方法是什么?
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
我希望能够使用几种类型的类,例如Program
,Log
等。但是我还没有定义这些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