概要
コードの一部を変更した結果、コード変更前のデータ、変更後のデータができます。
変更後のデータは容易に作成できるのでテストしやすいのですが、コード変更前のデータでも問題無く動作することをどうやってテストしようか、という話題です。
やり方
色々あると思いますが、旧コードを特異メソッドとして定義して、オーバーライドしてみました。
factory_girlにはafter(:build)
というhookがあって、ActiveRecordのafter_initialize
のようなタイミングで呼ばれます。
テストコードによってはafter(:create)
とかでも良いと思いますが、今回はsave
前にhookする必要があったのでafter(:build)
にしました。
factories/cart.rb
FactoryGirl.define do
factory :cart do
factory :cart_with_old_tax do
after(:build) do |cart, evaluator|
# Cart#price_with_taxはprice + ConsumptionTax.calc(price)に変更されている
def cart.price_with_tax
price + OldConsumptionTax.calc(price)
end
end
end
end
end
spec/cart_spec.rb
describe Cart do
describe '#price_with_tax' do
let(:cart) { create(:cart_with_old_tax) } # 旧コードのインスタンス
subject { Cart.find(cart.id) } # 新コードのインスタンス
end
end
おわりに
上記の例では旧税率のデータを作ればいいだけなんですが、factory_girl
でbefore_validation
を無視してデータを作る方法が分からなかったのでこんな感じでやってみました。
バッドノウハウの匂いがします。
直接DML投げてデータ作れれば楽なんですけどねぇ…