以前BDDとTDDはどう違うのか?という質問をされてうまく答えられませんでした。
現在私がBDDで好きだなと思い、TDDと異なると思うのは、BDDはとにかくまずプログラムに何をさせたいかを伝えることです。
暫くRoRとBDDで実践をしていて、決済のAPIを導入することがありました。最初はAPIの仕組みを調べてAPI指定のコマンドを直接コントローラに記述する形で、例えば
gateway = | PaypalApi::Billing.gateway
setup_purchase = gateway.setup_purchase
if setup_purchase.success?
redirect_to gateway.redirect_url_for(setup_purchase.token)
else
redirect_to somewhere-else, notice: "transaction failure"
end
などとしていたのですが、これだとテスト用APIのモックやスタッブを書くのがとても面倒。BDDではこのアプローチをやめて、とにかくAPIの仕様など気にしなくてプログラムに何をさせたいか書く事から始めるとすっきりします。例えばモデルのインスタンスを@orderにしている場合、
if @order.setup_purchase
redirect_to gateway_url
else
redirect_to somewhere-else, notice: "transaction failure"
end
としてモデルの中で実際にsetup_purchaseのコードを書きます。こうするとコードもテストコードも整理しやすくなります。
ただ実際はコントローラからtokenなどのpostリクエストの部分をモデルに渡す必要があるところで後でメソッドに引数を追加する必要など私の場合は出てきましたが。
No comments:
Post a Comment