วิธีการตั้งค่าส่วนหัวของคำขอใน rspec request spec?


128

ในข้อมูลจำเพาะคอนโทรลเลอร์ฉันสามารถตั้งค่า http accept header ได้ดังนี้:

request.accept = "application/json"

แต่ในข้อกำหนดคำขอออบเจ็กต์ "request" เป็นศูนย์ แล้วฉันจะมาทำที่นี่ได้อย่างไร?

เหตุผลที่ฉันต้องการตั้งค่า http accept header เป็น json คือฉันสามารถทำได้:

get '/my/path'

แทนสิ่งนี้

get '/my/path.json'

คำตอบ:


130

คุณควรจะสามารถระบุส่วนหัว HTTP เป็นอาร์กิวเมนต์ที่สามสำหรับเมธอด get () ของคุณตามที่อธิบายไว้ที่นี่:

http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

และที่นี่

http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

ดังนั้นคุณสามารถลองสิ่งนี้:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}

3
เราจำเป็นต้องใช้ 'HTTP_ACCEPT': get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti

58
หมายเหตุ: นี่มีไว้สำหรับการทดสอบการรวมระบบคล้ายกับความคิดเห็นด้านล่างในการทดสอบตัวควบคุม rspec-rail คุณจะใช้: request.env ["HTTP_ACCEPT"] =
Alex Soto

5
gotcha ตัวเล็กที่ฉันเจอเพราะฉันโง่: คีย์ส่วนหัวต้องเป็นสตริง สัญลักษณ์จะไม่ปรากฏขึ้น
ajmurmann

@ajmurmann ตอนนี้สัญลักษณ์ทำงาน: ส่วนหัว "การอนุญาต" สามารถเป็น:authorizationได้
Franklin Yu

13
ไวยากรณ์ RSspec 3 ใหม่จะเป็นเช่นget my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

ฉันใช้สิ่งนี้ในการทดสอบ :: หน่วย:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

3
ในทำนองเดียวกันดังที่ Alex Soto บันทึกไว้ในความคิดเห็นเกี่ยวกับคำตอบอื่นในการทดสอบตัวควบคุม rspec-rail คุณสามารถใช้: request.env ["HTTP_ACCEPT"]
gerry3

ขอบคุณมากเพื่อนตัวอย่างเดียวที่ใช้ได้กับฉันในแอป 2.3 รุ่นเก่าด้วยActionController::TestCase
ecoologic

+1 ฉันลองใช้คีย์ที่มีชื่อCookieในแฮชส่วนหัว (เพราะนั่นคือสิ่งที่เบราว์เซอร์ของฉันส่งมา) แต่มันไม่ได้ผล แล้วฉันจะทำและเห็นชื่อคีย์request.keys HTTP_COOKIEใช้ที่ได้ผล พวกเขาควรจัดทำเอกสารให้ดีกว่านี้
Kelvin

ได้ผลจริง! ฉันยังพบคำตอบนั้นในgithub.com/rspec/rspec-rails/issues/65
Stepan Zakharov

@Sytse Sijbrandij ไม่มีใครถามถึง Test :: Unit. คำถามถามเกี่ยวกับ rspec
Bryan Dimas

19

สิ่งนี้ใช้ได้กับข้อมูลจำเพาะของคอนโทรลเลอร์ไม่ใช่ขอข้อมูลจำเพาะ:

request.headers["My Header"] = "something"

2
สิ่งนี้ใช้ได้ผลสำหรับฉันขึ้นอยู่กับว่าคุณดึงส่วนหัวอย่างไรถ้าคุณใช้request.headersหรือrequest.env
Edgar Ortega

3
หมายเหตุ: ใช้สำหรับการทดสอบคอนโทรลเลอร์ไม่ใช่การทดสอบการรวมที่ระบุไว้ในคำถาม
Franklin Yu

3
ใช้ไม่ได้กับการทดสอบการรวมระบบ อย่างไรก็ตามใช้งานได้กับการทดสอบคอนโทรลเลอร์
Petr Gazarov

18

ฉันกำลังเพิ่มสิ่งนี้ที่นี่เนื่องจากฉันติดขัดอย่างมากในการพยายามทำสิ่งนี้ใน Rails 5.1.rc1

ลายเซ็นวิธีรับแตกต่างกันเล็กน้อยในขณะนี้

คุณต้องระบุตัวเลือกหลังพา ธ เป็นอาร์กิวเมนต์คำหลักเช่น

get /some/path, headers: {'ACCEPT' => 'application/json'}

FYI อาร์กิวเมนต์คำหลักชุดเต็ม ได้แก่ :

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


9

ฉันต้องตั้งค่าส่วนหัวแยกต่างหาก

request.headers["Accept"] = "application/json"

พยายามส่งผ่าน get / delete / .... เป็นขยะที่สมบูรณ์ใน rail4 และทำให้ปวดหัวเพราะไม่เคยส่งเป็นส่วนหัว แต่เป็นพารามิเตอร์

{"Accept" => "application/json"}

5
สิ่งนี้ให้คำตอบสำหรับคำถาม OP หรือไม่? หากเป็นคำถามใหม่ควรเปิดคำถามใหม่ดีกว่า
β.εηοιτ.βε

9

ใช้ rspec กับ Rack::Test::Methods

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

var ส่วนหัวจะมาเป็น X-Your-Header-Var


หมายเหตุ: สำหรับTest::Unitไม่ใช่ RSpec
Franklin Yu

rspec ระบุ
James Tan

1
ใช่. ใน rspec มันทำให้เกิดndefined method 'header'ข้อผิดพลาดสำหรับฉัน
ЕвгенийМасленков

7

ด้วย RSpec 3 คุณสามารถใช้ไวยากรณ์ต่อไปนี้

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

ตามที่อธิบายไว้ในเอกสาร Rspec อย่างเป็นทางการ (ลิงก์ชี้ไปที่ v3.7)


หวาน. สิ่งที่ฉันกำลังมองหา ขอบคุณ!
Francisco Quintero

6

ในการส่งทั้งสองxhr: trueส่วนและส่วนหัวฉันต้องทำเช่น:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers

1
นี่คือซอร์สโค้ดบน GitHub: github.com/rails/rails/blob/…
Karl Wilbur

ไม่ควรheaders =จะเป็นmy_headers =?
webaholik

แก้ไขแล้ว. ขอบคุณ @webaholik
Jim Stewart

2

คำถามของคุณได้รับคำตอบแล้ว แต่ในกรณีที่คุณต้องการโพสต์บางสิ่งเพื่อดำเนินการอื่นคุณต้องทำสิ่งนี้:

post :save, {format: :json, application: {param1: "test", param2: "test"}}

2

ลองสิ่งที่ชอบ:

get :index, :format => 'json' 

ไม่แน่ใจ แต่อาจใช้งานได้เนื่องจากรางกำลังมองหา. format สำหรับเส้นทางนั้น สิ่งนี้เกิดขึ้นกับฉันด้วย
Alan

2
ในกรณีที่ใครสงสัยสิ่งนี้จะเพิ่มformat=jsonเป็นพารามิเตอร์แบบสอบถาม ไม่เหมือนกับฟิลด์ส่วนหัว
Kevin Carmody
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.