【问题标题】:RSpec - How to test the if-else block in update method of controllerRSpec - 如何在控制器的更新方法中测试 if-else 块
【发布时间】:2020-07-22 18:18:42
【问题描述】:

假设我有一个数据库来存储人的数据(姓名、电子邮件)。并且控制器中有一个更新方法。方法是这样的:

  def update
    @people = People.find(params[:id])
    if @people.update(people_params)
       redirect_to people_path
    else
       render 'edit'
    end
  end

我想知道如何测试更新失败的情况?还是我真的需要测试它?我在 StackOverflow 上搜索过它,有一个关于它的 link,但它没有说明我是否应该测试它。谁能给我一些帮助?如果可以测试,如何测试?非常感谢!

【问题讨论】:

  • 您对People 模型有任何验证吗?分享模型代码。

标签: ruby-on-rails ruby ruby-on-rails-3 model-view-controller rspec


【解决方案1】:

根据其验证标准,更新失败通常是由于要保存的对象无效。您通常会在模型规范中测试验证标准,但在测试控制器或集成测试时,您可能希望确保在用户尝试保存无效模型时发生 #edit 渲染。

如果模型没有任何验证标准,您可以完全跳过else render :edit。它是 Rails 脚手架的一部分,可能并不适用于所有情况。

您可以通过尝试保存无效模型来测试更新失败的情况。您通常会确认用户被正确地告知了有效性问题(闪烁消息)。

是否测试没有对错之分。就个人而言,我会测试它,因为我喜欢 TDD,而且我更喜欢过度测试而不是测试不足。许多人不会。

【讨论】:

    【解决方案2】:
    1. 您不需要测试 Ruby 和 Rails 内部。要么您相信它们都按预期工作,要么您最好切换到其他语言/框架。

    2. 无论你是否还想测试它,模拟所有无关的东西。这是使用rspecflexmock 执行此操作的示例。

    describe '#update' do
      let(:person) { build(:people) }
      before do
        flexmock(People).should_receive(:find).once.returns person
        flexmock(person).should_receive(:update).once.returns false
      end
    
      it 'redirects to `edit` page' do
        ...
      end
    end
    

    【讨论】:

    • 我同意他不应该测试 Rails 内部,但理论上他应该测试行为,不是吗?更新成功时的重定向与失败时的渲染。
    • 这是测试if 是否按预期工作。确实如此。我发誓。
    • 什么是代码有错误,它redirects_to peple_path 而不是people_path?你是说这不应该被覆盖..
    • @Joel_Blum 如果您在测试中犯了同样的错误,并且peple_path 也存在怎么办?常识和 100% 覆盖率之间存在界限。我不是在提倡这一点,我的回答显示了 如何 实际上可以测试它。我个人不会浪费时间进行这样的测试。
    • 我意识到我在这里是个异类,但有时我最终会测试 Rails 内部,只是为了确保我对它们的工作原理的理解实际上就是它们的工作原理。我不是很聪明,所以我经常弄错!我在测试时睡得更好,而不是假设我知道它是如何工作的。
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2019-06-21
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多