Ruby on rails 如何在Rails中测试send_数据方法?

Ruby on rails 如何在Rails中测试send_数据方法?,ruby-on-rails,rspec,Ruby On Rails,Rspec,如何在Rails中测试send\u data方法?您不需要测试send\u data本身的行为,主要是因为Rails自己的测试涵盖了这一点。而且,它会使您的测试运行缓慢(最终)。从我的角度来看,您应该做的是存根send_data方法,类似于: controller.expected(:send_data)。with(“foo”)。returns(:success) 希望能有所帮助。当我读到他的问题时,我认为他的意思是,他如何确保send_data发送了字符串/无论他要求发送什么。与其说是测试它发

如何在Rails中测试
send\u data
方法?

您不需要测试
send\u data
本身的行为,主要是因为Rails自己的测试涵盖了这一点。而且,它会使您的测试运行缓慢(最终)。从我的角度来看,您应该做的是存根send_data方法,类似于:

controller.expected(:send_data)。with(“foo”)。returns(:success)


希望能有所帮助。

当我读到他的问题时,我认为他的意思是,他如何确保send_data发送了字符串/无论他要求发送什么。与其说是测试它发送的内容,不如说是为了确保他发送的方法不是空白的,这样可以让他安心。嘲笑,就像你所做的那样,并不能真正让他得到那个结果

也许你可以确保你的字符串不是空的,或者类似的东西。这样,您就不会测试send_数据,但无论send_数据得到什么,都是您想要的外观

在我的情况下(让我想到这个问题的原因)是


一些爱好者使用ruby调试器和sh!T您的里程数会有所不同。

您可以通过检查
内容传输编码
标题的值来间接测试里程数

expect(controller.headers["Content-Transfer-Encoding"]).to eq("binary") expect(controller.headers[“Content Transfer Encoding”])到eq(“binary”) 或

controller.headers[“内容传输编码”]应等于(“二进制”)
首先看一下
send\u data
方法的来源

根据这一点,
send_data
只需使用附加选项将所有内容放到
render:text=>“…”

我想你可以这样做:

response.body.should eql data
response.header['Content-Type'].should eql 'image/png'

对于
小型测试
版本回答:

assert_equal("application/json", response.header["Content-Type"])
assert_equal(expected_response, response.body)

控制器测试是关于模拟的。如果你需要一些“真实”的东西,做一个集成测试。下面的解决方案实际上是“rspec方式”,如果你想知道,控制器测试是关于模拟的?奇怪的声明,更糟糕的是,投了反对票。当你嘲笑这一点时,你并没有测试任何东西,只测试了send_数据被调用的事实,然后它继续做它的工作。在我的示例中,正如OP所说,我们正在测试send_数据是否真的完成了它的工作。一个测试是对思维的一种测试。使用集成测试。单元测试不是测试数据工作的地方。如果你变得迂腐,我实际上是建议,如果你使用Rails的说法,这个测试将是一个功能测试,但是不管测试的实际位置如何,答案仍然有效。我不推荐这样做。模仿您不拥有的代码通常不是一个好主意。如果
send_data
的API发生了变化(比如,Rails升级),您就不会知道您的代码已经损坏了。@XavierShay这是一个很有争议的问题。模拟和存根您不拥有的代码通常被认为是进行真正单元测试的唯一好方法。然而,“上游可能会改变”是您希望在测试中捕捉到的东西。但不是在单元测试中。您应该为此进行集成测试。(这是,正如你的观点,只是一个观点,有很多)“模拟和存根代码,你没有自己的,通常被认为是唯一的好方法有真正的单元测试。”参考?我想多读一些关于这项工作对人们有好处(长期)的文章。为了支持上面我自己的断言:关于(fwiw,我有一些关于控制器的替代方法的实验,更经典的是单元测试:)控制器的最重要的几个结果是未定义的
response.body.should eql data
response.header['Content-Type'].should eql 'image/png'
assert_equal("application/json", response.header["Content-Type"])
assert_equal(expected_response, response.body)