有了ruby on rails,我就有了一个player模型,它有很多games。然而,球员应该至少有三场比赛。我有一个自定义验证程序,如果没有三个游戏,它会增加错误。我可以通过在player模型中声明来创建一个有三个游戏的播放器
accepts_nested_attributes_for :games并使用播放器和游戏属性的嵌套散列来创建player及其游戏。
然而,出于测试的目的,我有时想一次添加一个游戏,使用rspec代码,如
player = create: :player
game = create :game
player.games << game但是,由于create :player触发了自定义验证,所以失败了,因为它没有三个游戏,所以这是行不通的。
有没有办法这么做。如果我无法做到这一点,我只能通过创建嵌套哈希来测试对特定游戏的敏感性,这使得很难看到测试正在做什么,因为关键的更改在哈希中很深。
发布于 2018-07-05 11:09:47
我不会建议跳过您的验证,即使在您的Rspecs中,除非它是无法避免的。如果可能的话,修改Rspecs以尊重验证。
你可以这样做:
let(:player) { build(:player) }
let(:game) { create(:game) }
let(:another_game) { create(:game) }
let(:one_more_game) { create(:game) }
it 'test something' do
player.games += [game]
# Do your stuff
player.games += [another_game]
# Do some more stuff
player.games += [one_more_game]
# and now that `player` object is valid, you can do:
player.save!
# Check your expectations here
end注:
player对象,而是构建player对象,这是允许的。你不需要创造一些东西,除非你真的需要它。let修改了您的变量。它们更适合Rspecs。希望这能解决你的问题。如果没有,请显示更多的Rspec代码,我们可以尝试修改它以支持验证。
发布于 2018-07-05 10:20:21
可以使用自定义方法来持久化对象。
factory :player do
to_create {|instance| instance.save(validate: false) }
endhttps://stackoverflow.com/questions/51187163
复制相似问题