Mã bạn đã sử dụng là tốt, mặc dù tôi sẽ cấu trúc hơi khác một chút vì tôi không muốn sử dụng it
chặn theo cách bạn thường thấy, tôi khuyến khích thử nghiệm nhiều khía cạnh của một hệ thống tại một thời điểm:
let(:body) { { :key => "abcdef" }.to_json }
before do
post '/channel/create', body, {'CONTENT_TYPE' => 'application/json'}
end
subject { last_response }
it { should be_ok }
tôi đã sử dụng let vì nó là tốt hơn so với một biến Ví dụ trong một khối before
(thanh danh cho bạn vì đã không làm điều đó). Các post
là trong một khối before
bởi vì nó không thực sự là một phần của spec, nhưng một tác dụng phụ xảy ra trước khi những gì bạn đang speccing. Các subject
là phản ứng và làm cho it
một cuộc gọi đơn giản.
Bởi vì kiểm tra phản ứng là ok là cần thiết vì vậy thường xuyên Tôi đặt nó trong một shared example:
shared_examples_for "Any route" do
subject { last_response }
it { should be_ok }
end
và sau đó gọi nó như vậy:
describe "Creating a new channel" do
let(:body) { { :key => "abcdef" }.to_json }
before do
post '/channel/create', body, {'CONTENT_TYPE' => 'application/json'}
end
it_should_behave_like "Any route"
# now spec some other, more complicated stuff…
subject { JSON.parse(last_response.body) }
it { should == "" }
và vì kiểu nội dung thay đổi thường xuyên , Tôi đặt nó trong một người trợ giúp:
module Helpers
def env(*methods)
methods.each_with_object({}) do |meth, obj|
obj.merge! __send__(meth)
end
end
def accepts_html
{"HTTP_ACCEPT" => "text/html" }
end
def accepts_json
{"HTTP_ACCEPT" => "application/json" }
end
def via_xhr
{"HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}
end
Thật dễ dàng để thêm vào nơi cần thiết bằng cách bao gồm nó thông qua cấu hình RSpec:
RSpec.configure do |config|
config.include Helpers, :type => :request
thì:
describe "Creating a new channel", :type => :request do
let(:body) { { :key => "abcdef" }.to_json }
before do
post '/channel/create', body, env(:accepts_json)
end
Có nói tất cả những gì, cá nhân, tôi sẽ không gửi sử dụng JSON. HTTP POST rất đơn giản để xử lý và mọi thư viện biểu mẫu và javascript đều dễ dàng và tốt. Trả lời bằng JSON bằng mọi cách, nhưng không đăng JSON, HTTP dễ dàng hơn rất nhiều.
Chỉnh sửa: sau khi viết ra Helpers
bit ở trên, tôi nhận ra it would be more helpful as a gem.
Anh có thấy cái này? http://stackoverflow.com/questions/5159882/how-to-check-for-a-json-response-using-rspec/5161898#5161898 – zetetic