gpt4 book ai didi

ruby-on-rails - 如何使用 Shoulda 正确测试此 Controller 操作?

转载 作者:行者123 更新时间:2023-11-28 20:34:33 25 4
gpt4 key购买 nike

我有以下 Controller 操作和测试。我刚开始使用 Shoulda 进行测试,并且我知道我可以进一步测试 Controller 的某些区域。例如,我的 flash 消息以及验证渲染。

所以我的问题是,我如何在 Shoulda 中正确测试这个 Controller 操作?

我的 Controller 操作(已更改名称以保护无辜者):

def my_action
return redirect_to(root_url) if @site.nil?
@owner = current_site.owner
if request.post?
if params[:password].blank? || params[:email].blank?
flash[:error] = "You must fill in both the e-mail and password fields"
render :action => "my_action"
else
if @owner.authenticated?(params[:password])
@owner.login = params[:email]
@owner.save!
@owner.do_some_method
flash[:success] = "Success."
render :action => "my_action"
else
flash[:error] = "Incorrect password"
render :action => "my_action"
end
end
end
end

我的测试:

context "on POST to :my_action" do
setup do
Owner.any_instance().expects(:do_some_method)
post :my_action, :email => 'foo@bar.com', :password => 'test'
end
should_assign_to :owner
should "Change name and verify password and resend activation key" do
assert_equal true, assigns(:owner).authenticated?('test')
assert_equal 'foo@bar.com', assigns(:owner).login
end
should_respond_with :success
end

最佳答案

现在,您似乎正在测试特定于 Controller 内部模型的功能,这应该在单元测试中。

我建议重构您的 Controller ,以在所有者模型中包含更新所有者电子邮件所需的逻辑。通过这样做,您应该能够将 Controller 简化为一个简单的 if update;别的; end 类型语句,大大简化了 Controller 测试。将逻辑移入模型后,您可以使用内置的 Rails 验证。

其他一些需要考虑的事情:

  • 在 POST 操作完成后重定向,防止用户意外重复发布(大多数浏览器会在用户尝试时发出警告)。
  • 如果在 Controller 内多次执行此操作,请将对 @site 的检查以及对 @owner 的分配移至 before_filters
  • 您可以避免使用 verify 或在 `config/routes.rb' 中创建路由来检查 if request.post?

引用资料:

关于ruby-on-rails - 如何使用 Shoulda 正确测试此 Controller 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com