微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

rails 测试不允许断言 before_action 的处理

如何解决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 举报,一经查实,本站将立刻删除。