ruby-on-rails - 如何在 ruby-on-rails 中测试破坏失败
问题描述
每个人。
我要测试一个活动记录对象销毁失败,但我在创建失败情况时遇到了问题。
我有一个名为“ require_user_payment_info ”的before_filter方法,它在调用delete方法之前验证@payment_info对象,因此在调用delete方法之前我无法创建“坏” @payment_info对象。
这是require_user_payment_info方法:
def require_user_payment_info
@payment_info = credit_card_model.slave.find_by_user_guid(user_guid)
if !@payment_info || @payment_info.user_guid != user_guid
redirect_to(:controller => 'store', :action => 'index') and return false
else
if((@payment_info.card_expires_year.to_i < Date.today.year) ||
((@payment_info.card_expires_month.to_i < Date.today.month) && (@payment_info.card_expires_year.to_i == Date.today.year)))
@payment_info.card_account_public = "" #clear this out so the user is forced to re-enter the credit card number
@payment_info.valid?
flash.now[:error] = t('ui_flash_errors.card_expired_error')
end
end
end
而实际的删除方法:
def delete
# required to be called via a delete request
redirect_to :action => 'edit' and return if !request.delete?
if @payment_info.destroy
flash[:notice] = "Delete SUCCESSFUL"
redirect_to :action => 'new'
else
flash[:error] = "Delete failed"
redirect_to :action => 'edit'
end
有任何想法吗?
解决方案
这是我的解决方案:
def test_delete
payment_info = Factory.create(:payment_info, :user_guid=>@user.guid, :card_expires_month=>'04',
:card_expires_year=>(Date.today.year+2).to_s, :cardholder_city=>"test city",
:cardholder_state=>'NC', :cardholder_country=>'US', :cardholder_zip=>'27612')
PaymentInfo.any_instance.stubs(:destroy).returns(false)
delete(:delete, {}, @session)
assert_response(:redirect)
assert_equal false, assigns(:payment_info).blank?
assert_redirected_to({:controller=>'account', :action=>'edit'})
assert_equal flash[:error], "There was an error deleting your credit card information. Please try again."
end
推荐阅读
- python - 使用烧瓶实现 ACL
- r - 为什么 tapply() 显示我过滤掉的条目?
- postgresql - 如何减少查询时间
- mysql - 根据结果数截断和连接mysql结果
- php - 第 47 行未定义的索引和无效的 foreach arg
- node.js - 我可以在 MongoDB 中将所需属性设置为多语言吗
- powershell - Powershell命令执行顺序问题
- json - 如何使用正则表达式断言 JSON 中存在多个键?
- python-3.x - 尝试通过 Python 使用 Selenium 定位输入框元素时无法定位元素错误
- sqlite - 如何修复错误:(26)文件不是 Sqlite DB 中的数据库