Rails 4, rspec 3: проверка валидации модели

У меня есть объект organization, который имеет атрибуты name, doing_business_as. Мне нужно проверить, что name не совпадает с doing_business_as.

# app/models/organization.rb
class Organization < ActiveRecord::Base
  validate :name_different_from_doing_business_as

  def name_different_from_doing_business_as
    if name == doing_business_as
      errors.add(:doing_business_as, "cannot be same as organization name")
    end
  end
end

У меня есть соответствующий файл rspec, который проверяет это:

# spec/models/organization_spec.rb
require "rails_helper"

describe Organization do
  it "does not allow NAME and DOING_BUSINESS_AS to be the same" do
    organization = build(:organization, name: "same-name", doing_business_as: "same-name")

    expect(organization.errors[:doing_business_as].size).to eq(1)
  end
end

Однако, когда я запускаю спецификацию, она терпит неудачу, и это то, что я получаю:

$ rspec spec/models/organization_spec.rb

Organization
  does not allow NAME and DOING_BUSINESS_AS to be the same (FAILED - 1)

Failures:

  1) Organization validations does not allow NAME and DOING_BUSINESS_AS to be the same
     Failure/Error: expect(organization.errors[:doing_business_as].size).to eq(1)

       expected: 1
            got: 0

       (compared using ==)
     # ./spec/models/organization_spec.rb:113:in `block (3 levels) in <top (required)>'

Finished in 0.79734 seconds (files took 3.09 seconds to load)
10 examples, 1 failure

Failed examples:

rspec ./spec/models/organization_spec.rb:110 # Organization validations does not allow NAME and DOING_BUSINESS_AS to be the same

Я ожидал, что спецификация пройдет, и убедитесь, что 2 атрибута не могут быть одинаковыми. В консоли Rails я могу подражать ожидаемому поведению, но я не могу заставить спецификацию успешно работать с ошибкой.

Я также проверил через Rails Console, что он работает как ожидалось:

$ rails c
> o = Organization.new(name: "same", doing_business_as: "same")
> o.valid?
  => false
> o.errors[:doing_business_as]
  => ["cannot be the same as organization name"]

Итак, я знаю, что есть функциональность, но я не могу получить работоспособный тест...

Ответ 1

Вам нужно использовать метод сборки вместо метода create.

# spec/models/organization_spec.rb
require "rails_helper"

describe Organization do
  it "does not allow NAME and DOING_BUSINESS_AS to be the same" do
    organization = build(:organization, name: "same-name", doing_business_as: "same-name")
    organization.valid?
    expect(organization.errors[:doing_business_as].size).to eq(1)
  end
end

или

# spec/models/organization_spec.rb
require "rails_helper"

describe Organization do
  it "does not allow NAME and DOING_BUSINESS_AS to be the same" do
    organization = build(:organization, name: "same-name", doing_business_as: "same-name")
    expect(organization).to be_invalid
  end
end