繁体   English   中英

RSpec - 如何在 controller 的更新方法中测试 if-else 块

[英]RSpec - How to test the if-else block in update method of controller

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

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

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

  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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM