こんにちは私は私のアプリにフロントエンドを持っていません。さまざまなクライアントで使用できるRESTfulAPIだけをリリースしたいと思っています。キュウリでそれをテストするためにどのように進めるべきかという指針はありますか?コントローラ内のすべてのアクションは、XMLフィードのみを生成します。何かアドバイスや提案はありますか?
5 に答える
webratのvisit
関数は、2 番目のパラメーターとして http_method を受け入れます。次のキュウリ ルールのように、API をテストすることもできます。
When /^I restfully delete (?:|the )user "([^\"]*)"$/ do |login|
visit(path_to("user \"#{login}\" page"), :delete)
end
Webrat は必要以上のものだと思います。XML フィードのテストでは、実際に HTML ページがない場合に、ページをロードしてすべてのマークアップ (リンク、フォームなど) を分析する Webrat のようなブラウザー シミュレーターは必要ありません。
むしろ、Curl ( http://curl.haxx.se ) や Curb (Rubyforge では Curl の Ruby バインディング)、Patron (RubyForge では) のようなものが必要です。
これらのライブラリは、好みに応じてリクエスト ヘッダーを作成し (たとえば、Content-Type の設定、GET PUT POST DELETE HEAD からの選択など)、レスポンスを取得し、必要に応じて 302 リダイレクトに従います。
返された応答を XML オブジェクトに変換し、Ruby で利用可能な XML パーサーを使用して出力をテストできます。また、(rubyforge で) XMLMapping クラスを記述して、XML 出力を Ruby オブジェクトに変換し、それらの属性などをテストすることもできます。これは、私見です。
jayzes は、Rack::Test::Methods、JSONpath、Nokogiri などを使用して json/xml API のテストを記述するキュウリのテスト ステップの例を共有しています。独自のステップを参照してさらに作成することをお勧めします。
RESTful ルートを設定したら、Webrat を使用してさまざまなルートにアクセスできるようになります。次に、各ルートが期待どおりの XML を返すことをテストできます。
以下は、RSpec で XML 出力をテストする方法を説明するブログ投稿です: XML 出力のテスト
Webratはヘッドレス ブラウザです。つまり、開発マシンで FireFox のような実際のブラウザを開かなくても、ブラウザをシミュレートできます。つまり、定義したステップに「visit 'users/'」などと入力するだけで、アプリケーションにアクセスするユーザーをシミュレートできます。
最後に、Pragmatic book on RSpec (まだベータ版) は、Cucumber、Webrat、および RSpec を組み合わせて使用し、BDD を使用してアプリケーション開発を推進する方法に関する優れたリソースです。
私はそれをやろうとしていたのですが、restful_authentication の大きな問題 (restful_auth の内部モデルの 1 つである AASM を使用しているようです) に行き詰まり、ログインするための解決策にたどり着きました:
Given /^I am logged in with a new account$/ do
login = "test"
@current_user = User.new(
:login => login,
:password => 'generic',
:password_confirmation => 'generic',
:email => "#{login}@example.com",
:state => "active"
)
@current_user.save
x = User.find_by_login(login)
x.state = "active"
x.save!
visit "/login"
fill_in("login", :with => login)
fill_in("password", :with => 'generic')
click_button
response.body.should =~ /Logged in successfully/m
end
よりクリーンなテストコーパスのためにモジュール化します。これは、私が見つけた概念をデモするためのものです。