36

Cucumber+Webrat から Cucumber+Capybara に切り替えたばかりで、Capybara の URL にコンテンツを POST する方法を知りたいです。

Cucumber+Webrat では、次のステップを実行できました。

When /^I send "([^\"]*)" to "([^\"]*)"$/ do |file, project|
  proj = Project.find(:first, :conditions => "name='#{project}'")
  f = File.new(File.join(::Rails.root.to_s, file))
  visit "project/" + proj.id.to_s + "/upload",
        :post, {:upload_path => File.join(::Rails.root.to_s, file)}
end

ただし、カピバラのドキュメントには次のように記載されています。

visit メソッドは 1 つのパラメーターのみを受け取り、リクエスト メソッドは常に GET.always GET です。

Cucumber+Capybara が URL に POST を実行するようにステップを変更するにはどうすればよいですか?

4

8 に答える 8

24

最近、このすばらしいブログ記事を見つけました。これは、Tony のような場合や、本当にキューに何かを投稿したい場合に最適です。

私の場合、これは次のようになりました。

def send_log(file, project)
  proj = Project.find(:first, :conditions => "name='#{project}'")
  f = File.new(File.join(::Rails.root.to_s, file))
  page.driver.post("projects/" + proj.id.to_s + "/log?upload_path=" + f.to_path)
  page.driver.status_code.should eql 200
end
于 2011-04-11T01:53:39.070 に答える
21

あなたはこれを行うことができます:

rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.submit :post, your_path, nil
  • または など、:post気になるメソッドを置き換えることができます。:put:delete
  • your_path必要なRailsパスに置き換えます。たとえばrack_test_session_wrapper.submit :delete, document_path(Document.last), nil、アプリの最後のドキュメントを削除します。
于 2012-03-08T11:48:32.207 に答える
13

ドライバーにない場合post(たとえば、Poltergeist にない場合)、次のようにすることができます。

session = ActionDispatch::Integration::Session.new(Rails.application)
response = session.post("/mypath", my_params: "go_here")

ただし、このリクエストは新しいセッションで発生するため、responseオブジェクトをアサートするにはオブジェクトを通過する必要があることに注意してください。

他の場所で述べたように、通常、Capybara テストでは、ユーザーと同じようにフォームを送信して POST を実行します。上記を使用して、別のセッションで (WebSockets を介して) POST が発生した場合にユーザーに何が起こるかをテストしたので、フォームはそれをカットしませんでした。

ドキュメント:

于 2014-06-22T16:50:19.410 に答える
9

Capybaravisitは GET リクエストのみを行います。これは仕様によるものです。

ユーザーが を実行するPOSTには、ボタンをクリックするか、フォームを送信する必要があります。ブラウザでこれを行う他の方法はありません。

この動作をテストする正しい方法は次のとおりです。

visit "project/:id/edit" # This will only GET
attach_file "photo", File.open('cute_photo.jpg')
click_button 'Upload' # This will POST

API をテストする場合はspec/request、cucumber の代わりに使用することをお勧めしますが、それは私だけです。

于 2010-11-03T10:24:06.630 に答える
5

回答が既に受け入れられていることは知っていますが、最新の回答を提供したいと思います。以下は、 Rack::Test を Cucumber の World オブジェクトに渡すAnthony EdenCorey Hainesの手法です。

Cucumber と Rack::Test を使用した REST API のテスト

この手法により、ステップ定義内で投稿リクエストを直接送信することができました。ステップ定義を書いている間、独自の仕様から Rack::Test API を学ぶことは非常に役に立ちました。

# feature
  Scenario: create resource from one time request
    Given I am an admin
    When I make an authenticated request for a new resource
    Then I am redirected  
    And I see the message "Resource successfully created" 

# step definitions using Rack::Test
When /^I make an authenticated request for a new resource$/ do
  post resources_path, :auth_token => @admin.authentication_token
  follow_redirect!
end

Then /^I am redirected$/ do
  last_response.should_not be_redirect
  last_request.env["HTTP_REFERER"].should include(resources_path)
end

Then /^I see the message "([^"]*)"$/ do |msg|
  last_response.body.should include(msg)
end
于 2011-10-31T20:05:33.337 に答える
3

質問に対する正確な答えではありませんが、私にとっての最良の解決策は、ユーザーの操作をシミュレートする仕様 (を使用visit) に Capybara を使用し、テスト API のようなリクエストに Rack Test を使用することです。これらは、同じテスト スイート内で一緒に使用できます。

getspec ヘルパーに以下を追加すると、postやその他の Rack テスト メソッドにアクセスできるようになります。

RSpec.configure do |config|
  config.include Rack::Test::Methods

spec/requestsRack Test 仕様をフォルダーに入れる必要がある場合があります。

于 2015-05-27T21:31:04.487 に答える