如何解决rails 测试不允许断言 before_action 的处理
以下单元测试在第一个断言中成功,但在第二个断言中失败
test "login_name,kee and virtual_qr changed" do
@user = users(:funky_mobile)
assert_changes 'users(:funky_mobile).mobile' do
@user.update(address: 'muuvt',mobile: '728363',mobile_nation_id: 1)
# patch update_user_path(@user_mobile),params: { user: { address: 'muuvt',mobile: '728364',mobile_nation_id: 1 } }
end
assert_changes 'users(:funky_mobile).login_name' do
@user.update(address: 'muuvt',mobile: '728365',mobile_nation_id: 1)
end
end
“users(:funky_mobile).login_name”没有改变。
注意:虽然 patch
- 按照以下方式尝试 - 处理正确,但它似乎不适用于单元测试。
带有 update
的单元测试仅注册提交的参数,但不会启动 before_action,如 test.log
User Update (0.5ms)[0m [1m[33mUPDATE "users" SET "mobile" = $1 WHERE "users"."id" = $2[0m [["mobile",728365],["id",165956397]]
相反,使用集成测试
sign_in users(:funky_mobile)
assert_changes 'users(:funky_mobile).login_name' do
patch user_url(@user_mobile),mobile_nation_id: 1 } }
end
“users(:funky_mobile).login_name”没有改变。
预期 nil 不等于 nil。
通过 before_action :set_user_login_name,only: %i[ update ]
的 users_controller
制定的更改数据
def set_user_login_name
if params[:user][:email].present?
params[:user][:login_name] = params[:user][:email].gsub(/\s+/,"")
elsif params[:user][:mobile_nation_id].present? && params[:user][:mobile].present?
@nation = Nation.where(id: params[:user][:mobile_nation_id]).first
params[:user][:login_name] = @nation.phone_cc.to_s + params[:user][:mobile].to_s
params[:user][:twilio_number] = '+' + @nation.phone_cc.to_s + params[:user][:mobile].to_s
else
params[:user][:login_name]
end
params[:user][:kee] = SecureRandom.alphanumeric(32)
params[:user][:virtual_qr_code] = params[:user][:login_name] + params[:user][:kee]
end
按照 test.log 的说明进行处理
User Update (0.7ms)[0m [1m[33mUPDATE "users" SET "login_name" = $1,"kee" = $2,"virtual_qr_code" = $3 WHERE "users"."id" = $4[0m [["login_name","39728364"],["kee","Rce8sQoH0VPvqUPeuegZL4gYVmJuamqi"],["virtual_qr_code","39728364Rce8sQoH0VPvqUPeuegZL4gYVmJuamqi"],165956397]]
TRANSACTION (0.1ms)[0m [1m[35mRELEASE SAVEPOINT active_record_1[0m
Redirected to http://www.example.com/users/165956397
奇怪的是,如果将集成测试更改为将 assert_changes 更改为简单
patch user_url(@user_mobile),mobile_nation_id: 1 } }
puts @user_mobile.mobile
assert_equal(39728364,@user_mobile.mobile)
返回
3331112200
F [...]
Expected: 39728364
Actual: 3331112200
但日志显示与上述相同的 User update
引用。
我如何正确断言这些更改正在实施?
解决方法
这会失败...
assert_changes 'users(:funky_mobile).login_name' do
因为……
users(:funky_mobile).login_name
每次都返回原始值。它正在调用夹具并充当常量。
你应该做的是...
login_name = users(:funky_mobile).login_name
assert_changes login_name do
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。