簡體   English   中英

如何在 Model Rails 中使用條件測試驗證

[英]How to test a validation with conditional in a Model Rails

我想知道是否必須在特定條件下測試 model。 假設我有一個需要國家/地區驗證的用戶 model。 該國家/地區驗證已在平台創建后 12 個月以上設置,因此,我們有一些用戶沒有驗證國家/地區(或沒有任何國家/地區)

這就是為什么我們有一個allow_nil: true

但是我們遇到了一個問題。 其中一位用戶需要重置他/她的密碼,但由於該國家/地區不是有效國家/地區,因此他/她無法重置他/她的密碼。

所以這就是我發現解決這個問題的方法:

unless: -> { reset_password_token.present? }

class User < Applicationrecord

VALID_COUNTRY_NAMES = ['Afghanistan', 'Åland', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica', 'Antigua and Barbuda'....]

validates :country, allow_nil: true, inclusion: { in: VALID_COUNTRY_NAMES }, unless: -> { reset_password_token.present? }
end

問題:我如何測試這個特定條件(具有無效國家的用戶想要重置密碼?

我對這個問題有點猶豫,我不得不承認測試對我來說並不容易。

解決方案

感謝@AbM,我可以通過以下測試解決它:

it 'allows existing user to reset password' do
  user = build(:user, country: 'invalid', reset_password_token: 'some_value')
  expect(user.reset_password_token).to eq('some_value')
  expect(user).to be_valid
end

我仍然不知道為什么我為一個如此簡單的測試而奮斗了這么多!

不要使用to be_valid匹配器。 當它失敗時,它不會告訴你關於被測實際行為的任何信息。

一個真正的問題是,您在 model 上一次測試每一個驗證,所以它確實比您的驗證更多地說明了您的工廠/固定裝置。

相反,只需使用有效或無效數據(排列)設置 model 並調用#valid? 觸發驗證(動作),然后根據 rails 提供的ActiveModel::Errors API編寫期望(斷言)。

context "when the user does not have a password reset token" do
  let(:user) do
    User.new(
      country: 'Lovely'
    )
  end
  it "does not allow an invalid country" do
    user.valid?
    expect(user.errors.details[:country]).to include { error: :inclusion, value: "Lovely" }
  end
end

context "when the user has a password reset token" do
  let(:user) do
    User.new(
      country: 'Lovely',
      reset_password_token: 'abcdefg'
    )
  end

  it "allows an invalid country" do
    user.valid?
    expect(user.errors.details[:country]).to_not include { error: :inclusion, value: "Lovely" }
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM