如何在Rails中测试send_data
方法?
答案 0 :(得分:20)
首先查看send_data
方法http://api.rubyonrails.org/classes/ActionController/DataStreaming.html#method-i-send_data
根据这一点,send_data
只是将所有内容放到render :text => '...'
并附加选项。
我认为你可以这样做:
response.body.should eql data
response.header['Content-Type'].should eql 'image/png'
答案 1 :(得分:9)
您不应该测试send_data
本身的行为,主要是因为Rails自己的测试已经涵盖了这一点。此外,它将使您的测试运行缓慢(最终)。你应该做的(从我的角度来看)是存根send_data方法,如:
controller.expects(:send_data).with("foo").returns(:success)
希望它有所帮助。
答案 2 :(得分:3)
您可以通过检查Content-Transfer-Encoding
标题的值来间接测试它。
expect(controller.headers["Content-Transfer-Encoding"]).to eq("binary")
或
controller.headers["Content-Transfer-Encoding"].should eq("binary")
答案 3 :(得分:2)
当我读到他的问题时,我认为这意味着,他如何确保send_data发送字符串/他要求的任何内容。不是为了测试它的发送,而是为了确保他的安心,他发送的方法并非空白。嘲笑,正如你所做的那样,并没有真正得到他那样的结果。
也许您可以确保您的字符串不是空白或类似的东西。这样你就不会测试send_data,但是无论send_data得到什么,你都希望它看起来像。
在我的情况下(是什么让我想到这个问题)将是
#just use this to make sure it looks like you want it to while you are writing your
#tests. I remove it after. make sure it's an instance variable @csv_string in my case.
puts assigns(:csv_string)
refute_nil assigns(:csv_string) #does the actual work. delete the puts line when done.
有些爱好者会使用ruby调试器,而且你的里程会有所不同。
答案 4 :(得分:0)
对于 minitest
版本的答案:
assert_equal("application/json", response.header["Content-Type"])
assert_equal(expected_response, response.body)