CucumberでJavascriptを含むページをテストする事を考えてみた

昨日も書きましたが、Cucumber は 内部で Webrat を使い、生成されたHTMLをチェックしたり、ボタン・リンクの動作をシミュレーションしています。 したがって、Javascriptを使ったページはテスト出来ません。
しかし、テストしたいページにJavascriptが使われている場合はどうしましょうか?

現在、作っているネットショップには、上の画像のようにショッピングカートに入った商品の数量を変更できます。ここでは変更のリンクをクリックすると、Javascript(jQuery)で数量とショッピングカート上の位置(連番)をサーバーに PUTしています。


さて少し視点をかえて、Cucumberでテストする対象はどこでしょうか?

ユーザーが使う範囲全てと考えれば当然 Javascriptも含めテストすべきですが、テスト範囲はサーバーサイドのみと決めれば(割り切れば) Javascript自身は動かさないで、Javascript相当の処理は Cucumber(steps)で行っても良いのではないでしょうか。


ということで、「商品の数量を変更」のシナリオでは以下のような steps を作って、Javascriptの動作を代行させました。
Webratの vist メソッドは第2,3引数にメソッドやデータを渡せるので便利です (::) (::)

When /^ショッピングカートの"([^\"]*)"番目の数量に"([^\"]*)"と入力し変更リンクをクリックする$/ do |no, value|
  visit cart_path(no.to_i - 1), :post,  {"_method" => "put", "quantity" => value}
end

また、JSONJavascriptに戻しJavascriptが描画等を行うアプリの場合は、responseに JSONの文字列が入るので、その内容を適当にチェックすれば良いのではないでしょうか。