RSpec - 如何测试控制器更新方法中的 if-else 块

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

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

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

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

  1. 您不需要测试 Ruby 和 Rails 内部结构。要么你相信它们都按预期工作,要么你最好切换到其他语言/框架。

  2. 不管你还想测试它,mock一切无关的东西。这是使用 rspecflexmock.

  3. 执行此操作的示例
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

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

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

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

考不考没有对错之分。就个人而言,我会测试它,b/c 我喜欢 TDD,我更喜欢过度测试而不是测试不足。许多人不会。