【问题标题】:How test the send_data method in Rails?如何在 Rails 中测试 send_data 方法?
【发布时间】:2010-06-17 16:06:48
【问题描述】:

如何在 Rails 中测试send_data 方法?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    首先看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'
    

    【讨论】:

      【解决方案2】:

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

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

      希望对你有帮助。

      【讨论】:

      • 我不推荐这个。模拟您不拥有的代码通常不是一个好主意。如果 send_data 的 API 发生变化(例如,Rails 升级),您将不会知道您的代码已损坏。
      • @XavierShay 值得商榷。您不拥有的模拟和存根代码通常被认为是进行真正单元测试的唯一好方法。但是,“上游可能会改变”是您想要在测试中捕捉到的东西。但不是在单元测试中。您应该为此进行集成测试。 (这个,是,正如你的观点,只是一个意见,有很多)
      • “模拟和存根你不拥有的代码通常被认为是进行真正单元测试的唯一好方法。”参考?我想阅读更多关于这对人们运作良好(长期)的信息。为了支持我自己的上述断言:jmock.org/oopsla2004.pdfgoogle.com/?#safe=active&q=only+mock+types+you+own 上的前几条结果
      • (我有一些关于控制器的替代方法的实验,这些方法更经典的单元测试:github.com/xaviershay/poniard
      【解决方案3】:

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

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

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

      【讨论】:

      • 控制器未定义
      【解决方案4】:

      当我阅读他的问题时,我认为他的意思是,他如何确保 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... 你的里程会有所不同。

      【讨论】:

      • 控制器测试是关于模拟的。如果您需要“真实”的东西,请进行集成测试。如果您愿意,下面的解决方案实际上是“rspec 方式”。
      • 控制器测试是关于模拟的?奇怪的声明,更糟糕的是,投了反对票。当你模拟它时,除了 send_data 被调用并且它继续工作的事实之外,你没有测试任何东西。在我的示例中,正如 OP 所说,我们正在测试 send_data 是否真的在做它的工作。一种思维方式的测试。
      • 为此使用集成测试。单元测试不是测试 send_data 工作的地方。
      • 好吧,如果你变得迂腐,我实际上是在建议这个测试将是一个功能测试,如果你使用 Rails 的说法,但不管测试的实际位置如何,再次,答案立场。
      【解决方案5】:

      对于minitest 版本的答案:

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

      【讨论】:

        猜你喜欢
        • 2011-09-13
        • 2016-08-21
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多