如何测试Rails中的send_data方法?

时间:2010-06-17 16:06:49

标签: ruby-on-rails rspec

如何在Rails中测试send_data方法?

5 个答案:

答案 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)