我正在尝试测试邮政编码属性的长度以确保其长度为 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
使用have_attributes
内置匹配器:
expect("90210").to have_attributes(size: 5) # passes
expect([1, 2, 3]).to have_attributes(size: 3) # passes
您还可以与其他匹配器组合它(此处为be
):
expect("abc").to have_attributes(size: (be > 2)) # passes
expect("abc").to have_attributes(size: (be > 2) & (be <= 4)) # passes
如果您在 ActiveRecord 模型上测试验证,我建议您尝试shoulda-matchers
. 它提供了一堆对 Rails 有用的 RSpec 扩展。您可以为您的邮政编码属性编写一个简单的一行规范:
describe Address do
it { should ensure_length_of(:zip_code).is_equal_to(5).with_message(/invalid/) }
end
集合匹配器(所有针对字符串、哈希和数组断言的匹配器)已被抽象为一个单独的 gem,rspec-collection_matchers。
为了使用这些匹配器,请将其添加到您的Gemfile
:
gem 'rspec-collection_matchers'
或者.gemspec
,如果您正在研究宝石:
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
匹配器及其变体可用于数组、哈希和您的字符串。