郵便番号属性の長さをテストして、5 文字であることを確認しようとしています。現在、空白ではなく、4 文字では短すぎ、6 文字では長すぎることを確認するためにテストしています。
正確に5文字であることをテストする方法はありますか? これまでのところ、オンラインや rspec の本には何も見つかりませんでした。
have
RSpec の最新のメジャー リリースにはマッチャーがありません。
RSpec 3.1 の時点で、これをテストする正しい方法は次のとおりです。
expect("Some string".length).to be(11)
RSpec はこれを可能にします:
expect("this string").to have(5).characters
実際には「文字」の代わりに何でも書くことができます。それは単なる構文糖衣です。起こっていることは、RSpec がこの件について呼びかけ#length
ていることだけです。
ただし、あなたの質問からは、実際に検証をテストしたいように思えます。その場合、@rossta のアドバイスに従います。
アップデート:
RSpec 3 以降、これは rspec-expectations の一部ではなくなりましたが、別の gem として利用できます: https://github.com/rspec/rspec-collection_matchers
コレクション マッチャー (文字列、ハッシュ、配列に対してアサートするすべてのマッチャー) は、個別の gem rspec-collection_matchersに抽象化されています。
これらのマッチャーを使用するには、これを に追加しますGemfile
。
gem 'rspec-collection_matchers'
または.gemspec
、gem に取り組んでいる場合:
spec.add_development_dependency 'rspec-collection_matchers'
次に、これをに追加しますspec_helper.rb
:
require 'rspec/collection_matchers'
そして、仕様でコレクション マッチャーを使用できるようになります。
require spec_helper
describe 'array' do
subject { [1,2,3] }
it { is_expected.to have(3).items }
it { is_expected.to_not have(2).items }
it { is_expected.to_not have(4).items }
it { is_expected.to have_exactly(3).items }
it { is_expected.to_not have_exactly(2).items }
it { is_expected.to_not have_exactly(4).items }
it { is_expected.to have_at_least(2).items }
it { is_expected.to have_at_most(4).items }
# deliberate failures
it { is_expected.to_not have(3).items }
it { is_expected.to have(2).items }
it { is_expected.to have(4).items }
it { is_expected.to_not have_exactly(3).items }
it { is_expected.to have_exactly(2).items }
it { is_expected.to have_exactly(4).items }
it { is_expected.to have_at_least(4).items }
it { is_expected.to have_at_most(2).items }
end
items
と互換的に使用できることに注意してくださいcharacters
。これらは単なる構文糖であり、have
マッチャーとそのバリアントは、配列、ハッシュ、および文字列で使用できます。
ActiveRecord モデルで検証をテストしている場合は、試してみることをお勧めしshoulda-matchers
ます。これは、Rails に役立つ一連の便利な RSpec 拡張機能を提供します。郵便番号属性の簡単な 1 行仕様を記述できます。
describe Address do
it { should ensure_length_of(:zip_code).is_equal_to(5).with_message(/invalid/) }
end