如何测试Rails中的send_data方法?

Pav*_*yak 16 rspec ruby-on-rails

如何send_data在Rails中测试方法?

Art*_*cki 24

首先看一下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'
Run Code Online (Sandbox Code Playgroud)


jpe*_*thy 8

您不应该测试send_data自身的行为,主要是因为Rails自己的测试已经涵盖了这一点.此外,它将使您的测试运行缓慢(最终).你应该做什么(从我的角度来看)是存根send_data方法,如:

controller.expects(:send_data).with("foo").returns(:success)

希望能帮助到你.

  • 我不推荐这个.模拟你不拥有的代码通常不是一个好主意.如果`send_data`的API发生了变化(例如,使用Rails升级),您将无法知道您的代码是否已损坏. (5认同)
  • @XavierShay是值得商榷的.您不拥有的模拟和存根代码通常被认为是进行实际单元测试的唯一好方法.但是,"上游可能会改变"是您希望在测试中捕获的内容.但不是在单元测试中.您应该进行集成测试.(这是,就像你的意思,只是一个意见,有很多) (3认同)

Tsu*_*omu 5

您可以通过检查Content-Transfer-Encodingheader的值来间接测试它。

期望(控制器。头[“内容传输编码”])。到eq(“二进制”)

或者

controller.headers["Content-Transfer-Encoding"].should eq("binary")


pja*_*mer 1

当我读到他的问题时,我认为他的意思是,他如何确保 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.
Run Code Online (Sandbox Code Playgroud)

一些狂热的人使用 ruby​​ 调试器,但你的里程会有所不同。