복붙노트

[RUBY-ON-RAILS] 어떻게 카피 바라의 URL에 POST합니까?

RUBY-ON-RAILS

어떻게 카피 바라의 URL에 POST합니까?

그냥 오이 + 카피 바라에 오이 + Webrat로 전환하고 난 당신이 카피 바라의 URL에 콘텐츠를 게시 할 수있는 방법 궁금.

오이 +에서 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

그러나, 카피 바라 설명서를 언급한다 :

어떻게 그렇게 오이 + 카피 바라가 URL에 POST를 수행 나의 단계를 수정합니까?

해결법

  1. ==============================

    1.최근에 나는이 위대한 블로그 게시물을 발견했다. 당신이 정말로 당신의 오이 포스트 뭔가 원하는 토니 같은 경우와에 좋은 곳입니다 어떤 :

    최근에 나는이 위대한 블로그 게시물을 발견했다. 당신이 정말로 당신의 오이 포스트 뭔가 원하는 토니 같은 경우와에 좋은 곳입니다 어떤 :

    내 경우를 들어이되었다 :

    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
    
  2. ==============================

    2.이 작업을 수행 할 수 있습니다 :

    이 작업을 수행 할 수 있습니다 :

    rack_test_session_wrapper = Capybara.current_session.driver
    rack_test_session_wrapper.submit :post, your_path, nil
    
  3. ==============================

    3.드라이버가 (심령 예를 들어,하지 않습니다) 포스트가없는 경우, 당신은이 작업을 수행 할 수 있습니다 :

    드라이버가 (심령 예를 들어,하지 않습니다) 포스트가없는 경우, 당신은이 작업을 수행 할 수 있습니다 :

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

    그러나이 요청이 새 세션에서 발생하는 것으로, 그래서 당신은 그것을 주장 응답 오브젝트를 거쳐야합니다.

    으로는 카피 바라 시험에서 당신은 일반적으로 단지 것 사용자와 같은 양식을 제출 게시물을하고 싶은 다른 곳에서 언급되고있다. 형태가 그것을 잘라하지 않을 그래서는 POST가 (WebSocket을 통해) 다른 세션에서 발생하는 경우 사용자에게 무슨 시험에 위의를 사용했다.

    문서 도구 :

  4. ==============================

    4.카피 바라의 방문은 GET 요청 만 수행. 이것은 의도적으로 설계된 동작입니다.

    카피 바라의 방문은 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를 테스트하려면, 내가 대신 오이의 사양 / 요청을 사용하는 것이 좋습니다,하지만 나를 그냥.

  5. ==============================

    5.나는 대답이 이미 받아 들여졌다 알지만, 업데이트 된 대답을 제공하고 싶습니다. 여기에 오이의 세계 객체에 랙 :: 테스트를 통과 앤서니이든 코리 헤인즈에서 기술이다 :

    나는 대답이 이미 받아 들여졌다 알지만, 업데이트 된 대답을 제공하고 싶습니다. 여기에 오이의 세계 객체에 랙 :: 테스트를 통과 앤서니이든 코리 헤인즈에서 기술이다 :

    테스트 REST 오이 API 및 랙 :: 시험

    이 기술을, 내가 직접 단계 정의에서 포스트 요청을 보낼 수 있었다. 단계 정의를 작성하는 동안, 자신의 사양에서 랙 :: 테스트 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
    
  6. ==============================

    6.질문에없는 정확한 대답하지만, 나를 위해 가장 좋은 방법은 시뮬레이션 사용자 상호 작용 (방문 사용) 것을 사양에 대한 카피 바라를 사용하고, 요청 등의 테스트 API에 대한 테스트 랙하는 것이 었습니다. 그들은 동일한 테스트 스위트에서 함께 사용할 수 있습니다.

    질문에없는 정확한 대답하지만, 나를 위해 가장 좋은 방법은 시뮬레이션 사용자 상호 작용 (방문 사용) 것을 사양에 대한 카피 바라를 사용하고, 요청 등의 테스트 API에 대한 테스트 랙하는 것이 었습니다. 그들은 동일한 테스트 스위트에서 함께 사용할 수 있습니다.

    사양 도우미에 다음을 추가하면 얻을 수있는 액세스, 포스트 및 기타 랙 시험 방법을 제공합니다 :

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

    당신은 사양 / 요청 폴더에 랙 테스트 사양을 둘 필요가 있습니다.

  7. ==============================

    7.RSpec에 3+를 사용하여 응용 프로그램으로, 당신은 카피 바라와의 HTTP POST 요청을 싶지 않을 것이다. 카피 바라 사용자 행동을 모방하고 JS 동작 결과 그 페이지의 콘텐츠를 수용하기위한 것이다. 응용 프로그램의 리소스에 대한 최종 사용자 나던 형태로 HTTP POST 요청, 사용자가 클릭 버튼, n은 요소을 제출 웹 양식 등을 삭제 드래그, 아약스 링크를 클릭

    RSpec에 3+를 사용하여 응용 프로그램으로, 당신은 카피 바라와의 HTTP POST 요청을 싶지 않을 것이다. 카피 바라 사용자 행동을 모방하고 JS 동작 결과 그 페이지의 콘텐츠를 수용하기위한 것이다. 응용 프로그램의 리소스에 대한 최종 사용자 나던 형태로 HTTP POST 요청, 사용자가 클릭 버튼, n은 요소을 제출 웹 양식 등을 삭제 드래그, 아약스 링크를 클릭

    카피 바라와 다른 HTTP 방법에 대한이 블로그 게시물을 확인하세요. 저자는 다음과 같은 주장을한다 :

    그래서, 당신은 명시 적 HTTP POST 요청을해야하고,이 HTML 요소 및 이벤트의 일종 (클릭, 드래그, 선택, 대한 focusOut을, 무엇이든)을 포함하지 않는 경우, API를 개발하거나하지, 그것은 안 카피 바라 테스트. 당신은 몇 가지 버튼을 클릭하여 동일한 기능을 테스트 할 수 있다면, 카피 바라를 사용합니까.

    당신이 가능성이 원하는 것은 RSpec에 요청 사양입니다. 여기 후 전화 및 기타 HTTP 방법을뿐만 아니라 확인하고 응답에 기대 어설 수 있습니다. 당신은 또한 모의 N 스텁 개체와 귀하의 요청과 응답 사이에서 일어날 부작용 및 기타 행동에 관해서 어설 션 기대 방법.

    # spec located in spec/requests/project_file_upload_spec.rb
    require "rails_helper"
    
    RSpec.describe "Project File Upload", type: :request do
    
      let(:project) { create(:project) }
      let(:file)    { File.new(File.join(::Rails.root.to_s, 'path/to/file.ext')) } # can probably extract this to a helper...
    
      it "accepts a file uploaded to a Project resource" do
    
        post "project/#{project.id}/upload", upload_path: file
    
        expect(response).to be_success
        expect(project.file?).to eq(true)
        # expect(project.file).not_to eq(nil)
        expect(response).to render_template(:show)
      end
    
    end
    
  8. from https://stackoverflow.com/questions/4084212/how-do-you-post-to-a-url-in-capybara by cc-by-sa and MIT license