การทดสอบ AJAX POST โดยใช้ Rack :: Test - จะส่งข้อมูลได้อย่างไร

ฉันใช้ Rack::Test เพื่อทดสอบแอปของฉันและต้องทดสอบการโพสต์ข้อมูลผ่าน อาแจ็กซ์

การทดสอบของฉันดูเหมือนว่า:

describe 'POST /user/' do
  include Rack::Test::Methods
  it 'must allow user registration with valid information' do
    post '/user', {
      username: 'test_reg',
      password: 'test_pass',
      email: '[email protected]'
    }.to_json, {"CONTENT_TYPE" => 'application/json', "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
    last_response.must_be :ok?
    last_response.body.must_match 'test_reg has been saved'
  end
end

แต่ที่ฝั่งเซิร์ฟเวอร์จะไม่ได้รับข้อมูล POSTed

ฉันยังลองส่งแฮชของ params โดยไม่มี to_json แต่นั่นก็ไม่ได้สร้างความแตกต่าง

มีความคิดอย่างไรในการทำเช่นนี้?


person Dave Sag    schedule 10.09.2013    source แหล่งที่มา


คำตอบ (2)


ตำแหน่งข้อมูลโพสต์ของคุณจะต้องแยกวิเคราะห์เนื้อหา JSON ที่โพสต์ ซึ่งฉันคิดว่าคุณทำอยู่แล้ว คุณสามารถโพสต์วิธีการทำงานของจุดสิ้นสุดของคุณ รวมถึงหมายเลขเวอร์ชันของการทดสอบชั้นวาง, ชั้นวาง, ทับทิมและซินาตร้าได้หรือไม่ โปรดระบุวิธีทดสอบว่าเซิร์ฟเวอร์รับสิ่งใดหรือไม่ กล่าวคือ การจำลองการทดสอบอาจทำให้การตรวจจับของคุณสับสน

    post '/user' do
       json_data = JSON.parse(request.body.read.to_s)
       # or # json_data = JSON.parse(request.env["rack.input"].read)
       ...
    end
person diminish    schedule 17.09.2013
comment
น่าสนใจ. ในรหัสแอปพลิเคชันจริงของฉัน ตัวแปร params ของ Sinatra ได้รับการเติมข้อมูลโดยอัตโนมัติด้วยข้อมูลที่มาจากคำขอ AJAX แต่เมื่อส่งข้อมูลจากการทดสอบ ฉันสามารถแยกออกได้ตามที่คุณแนะนำ แต่ params จะไม่ถูกเติม แน่นอนว่าเมื่อฉันเพิ่มบรรทัด JSON.parse ลงในโค้ด ฉันจะได้รับ JSON::ParserError นี่ทำให้ฉันสงสัยว่าปัญหาเกิดขึ้นกับวิธีที่เมธอด ajaxSubmit ของปลั๊กอิน jQuery forms กำลังส่งข้อมูล ดูเหมือนว่าข้อผิดพลาดของฉันไม่ได้อยู่ในการทดสอบเลย ขอขอบคุณที่คุณได้ให้คำถามแก่ฉันเพื่อสำรวจเพิ่มเติม - person Dave Sag; 18.09.2013

เอาล่ะ โซลูชันของฉันค่อนข้างแปลกและเฉพาะเจาะจงกับวิธีที่ฉันเรียกใช้คำขอ JSON ในตอนแรก นั่นคือการใช้ปลั๊กอิน jQuery Validation และ jQuery Forms ที่ฝั่งไคลเอ็นต์ jQuery Forms ไม่ได้รวมเขตข้อมูลแบบฟอร์มเข้ากับแฮชแบบสตริงตามที่ฉันคาดไว้ แต่ส่งเขตข้อมูลแบบฟอร์มผ่าน AJAX แต่เป็นสตริงพารามิเตอร์ที่เข้ารหัส URI แบบคลาสสิก ดังนั้นการเปลี่ยนการทดสอบของฉันเป็นแบบต่อไปนี้ ตอนนี้ก็ใช้ได้ดีแล้ว

describe 'POST /user/' do
  include Rack::Test::Methods
  it 'must allow user registration with valid information' do
    fields = {
      username: 'test_reg',
      password: 'test_pass',
      email: '[email protected]'
    }
    post '/user', fields, {"HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
    last_response.must_be :ok?
    last_response.body.must_match 'test_reg has been saved'
  end
end

แน่นอนว่านี่เป็นวิธีเฉพาะของวิธีการทำงานของปลั๊กอิน jQuery Forms และไม่ใช่วิธีปกติในการทดสอบ POSTing ของข้อมูล JSON ผ่าน AJAX ฉันหวังว่านี่จะช่วยผู้อื่นได้

person Dave Sag    schedule 18.09.2013
comment
จำเป็นไหม? ฉันรู้สึกว่าหากคุณปล่อย Content-Type และ URI.encode_www_form ออกไป มันจะประมวลผลแบบฟอร์มเป็น JSON หรือ Form-URL-Encoded โดยอัตโนมัติ (คุณไม่ได้พูดถึงที่นี่หรือในคำถามว่าคุณพยายามโดยไม่มีอาร์กิวเมนต์ที่สาม (เช่นแฮช) เพื่อโพสต์ ()) - person Rob Howard; 18.09.2013
comment
ขอบคุณ @RobHoward ฉันเปลี่ยนการทดสอบแล้วและคุณพูดถูก ฉันได้อัปเดตคำตอบของฉันแล้ว ฉันยังต้องการพารามิเตอร์ HTTP_X_REQUESTED_WITH ดังนั้นเซิร์ฟเวอร์จึงรู้ว่ามันเป็น AJAX ไชโย D - person Dave Sag; 19.09.2013
comment
ขอบคุณ. ฉันกำลังพยายามให้กรณีทดสอบทำงานและมันก็ล้มเหลวเพราะฉันไม่สามารถหาวิธีที่จะทำให้มันส่งคำขอ xhr ได้ (ใน Padrino พร้อม Minitest หากมีความช่วยเหลือใด ๆ ) การเพิ่มส่วนหัว HTTP_X_REQUESTED_WITH ช่วยแก้ปัญหานี้! - person Oranges13; 09.02.2016