【发布时间】:2010-06-17 16:06:48
【问题描述】:
如何在 Rails 中测试send_data 方法?
【问题讨论】:
标签: ruby-on-rails rspec
如何在 Rails 中测试send_data 方法?
【问题讨论】:
标签: ruby-on-rails rspec
首先看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'
【讨论】:
您不需要测试send_data 本身的行为,主要是因为 Rails 自己的测试已经涵盖了这一点。此外,它会使您的测试运行缓慢(最终)。您应该做的(从我的角度来看)是将 send_data 方法存根,例如:
controller.expects(:send_data).with("foo").returns(:success)
希望对你有帮助。
【讨论】:
send_data 的 API 发生变化(例如,Rails 升级),您将不会知道您的代码已损坏。
您可以通过检查Content-Transfer-Encoding header 的值来间接测试它。
或
controller.headers["Content-Transfer-Encoding"].should eq("binary")【讨论】:
当我阅读他的问题时,我认为他的意思是,他如何确保 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 调试器和 sh!t... 你的里程会有所不同。
【讨论】:
对于minitest 版本的答案:
assert_equal("application/json", response.header["Content-Type"])
assert_equal(expected_response, response.body)
【讨论】: