在RSpec中测试模型属性时避免重复

时间:2015-12-08 15:09:48

标签: ruby rspec factory-bot

我有几个模型,在这个模型中我有属性,我不想空白/空。

我想使用RSpec和Factory Girl对这些限制进行大量测试。

但是我最终得到了代码重复:

user_spec:

it 'is invalid if blank' do
  expect {
   FactoryGirl.create(:user, nickname => '')
  }.to raise_error(ActiveRecord::RecordInvalid)
end

message_spec:

it 'is invalid if blank' do
  expect {
   FactoryGirl.create(:message, :re => '')
  }.to raise_error(ActiveRecord::RecordInvalid)
end

我该如何考虑它?

1 个答案:

答案 0 :(得分:0)

RSpec提供了几种方法,例如Shared Examples

<强> 1。在[RAILS_APP_ROOT]/support/

中创建一个文件

根据您的示例,您可以将此文件命名为not_blank_attribute.rb。然后,您只需移动重复的代码并进行调整以使其可配置:

RSpec.shared_examples 'a mandatory attribute' do |model, attribute|
  it 'should not be empty' do
    expect {
      FactoryGirl.create(model, attribute => '')
    }.to raise_error(ActiveRecord::RecordInvalid)
  end
end

<强> 2。在您的规范中使用it_behaves_like功能

此函数将调用共享示例。

RSpec.describe User, '#nickname' do
  it_behaves_like 'a mandatory attribute', :User, :nickname
end

最后,它输出:

User#nickname
  behaves like a mandatory attribute
      should not be empty