ted*_*ted 3 rspec ruby-on-rails rspec2 factory-bot
以下是我使用的代码:
这是我的app/models档案:
class One < ActiveRecord::Base
attr_accessible :name, :surname
end
class Two < ActiveRecord::Base
attr_accessible :name, :one_surname
# generate a list of one's surnames
def self.LIST_SURNAMES
list = Array.new
arr = One.all
arr.each {|one| list << one.surname}
return list
end
validates :one_surname, :inclusion => self.LIST_SURNAMES()
end
Run Code Online (Sandbox Code Playgroud)
这是我的/spec/models档案:
FactoryGirl.define do
factory :two do
name "two_name"
end
factory :one do
name "one_name"
surname "one_surname"
end
end
describe Two do
it 'should be created' do
@one = FactoryGirl.create(:one)
puts "One.last.surname = #{One.last.surname}"
puts "Two.LIST_SURNAMES = #{Two.LIST_SURNAMES}"
@two = FactoryGirl.build(:two, :one_surname => Two.LIST_SURNAMES[0])
@two.save!
end
end
Run Code Online (Sandbox Code Playgroud)
但是,我的测试失败了.而且我完全不确定为什么会这样.有什么想法吗?
这是RSpec输出:
One.last.surname = one_surname
Two.LIST_SURNAMES = ["one_surname"]
Run Code Online (Sandbox Code Playgroud)
此外,我得到了这个失败:
1) Two should be created
Failure/Error: @two.save!
ActiveRecord::RecordInvalid:
Validation failed: One surname is not included in the list
# ./category_spec.rb:29:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
它在解释时执行Two.LIST_SURNAMES,而不是运行时.因此,如果您希望它在运行时获取LIST_SURNAMES,则需要使用proc
validates :one_surname, :inclusion => {:in => proc {self.LIST_SURNAMES()}}
Run Code Online (Sandbox Code Playgroud)
其余的是可选的,但这里有一些清理过的代码:
class Two < ActiveRecord::Base
attr_accessible :name, :one_surname
validates :one_surname, :inclusion => {in: proc{One.pluck(:surname)}}
end
Run Code Online (Sandbox Code Playgroud)
我更换了LIST_SURNAMES与方法,One.pluck(:surname)它做同样的事情.另外:LIST_SURNAMES,如果你保留它,应该是def self.list_surnames因为它不是常量.
| 归档时间: |
|
| 查看次数: |
1078 次 |
| 最近记录: |