属性name, doing_business_as
を持つorganization
オブジェクトがあります。 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
しかし、スペックを実行するとfailsになり、これは私が得るものです:
$ 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コンソールを介して、期待どおりに動作することも確認しました。
$ 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"]
だから私は機能がそこにあることを知っています、しかし私は実用的なテストを得ることができません...
Createメソッドの代わりにbuildメソッドを使用する必要があります。
# 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