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 上搜索过它,有一个关于它的 ,但它没有说明我是否应该测试它。谁能给我一些帮助吗?如果可以测试,如何?非常感谢!
您不需要测试 Ruby 和 Rails 内部结构。要么你相信它们都按预期工作,要么你最好切换到其他语言/框架。
不管你还想测试它,mock一切无关的东西。这是使用 rspec
和 flexmock
.
执行此操作的示例
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,我更喜欢过度测试而不是测试不足。许多人不会。
假设我有一个数据库来存储人员数据(姓名、电子邮件)。控制器中有一个更新方法。方法是这样的:
def update
@people = People.find(params[:id])
if @people.update(people_params)
redirect_to people_path
else
render 'edit'
end
end
请问如何测试更新失败的情况?或者我真的需要测试它吗?我在 Whosebug 上搜索过它,有一个关于它的
您不需要测试 Ruby 和 Rails 内部结构。要么你相信它们都按预期工作,要么你最好切换到其他语言/框架。
不管你还想测试它,mock一切无关的东西。这是使用
rspec
和flexmock
. 执行此操作的示例
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,我更喜欢过度测试而不是测试不足。许多人不会。