首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖自定义验证

覆盖自定义验证
EN

Stack Overflow用户
提问于 2018-07-05 08:56:55
回答 2查看 219关注 0票数 0

有了ruby on rails,我就有了一个player模型,它有很多games。然而,球员应该至少有三场比赛。我有一个自定义验证程序,如果没有三个游戏,它会增加错误。我可以通过在player模型中声明来创建一个有三个游戏的播放器

代码语言:javascript
复制
accepts_nested_attributes_for :games

并使用播放器和游戏属性的嵌套散列来创建player及其游戏。

然而,出于测试的目的,我有时想一次添加一个游戏,使用rspec代码,如

代码语言:javascript
复制
player = create: :player
game = create :game
player.games << game

但是,由于create :player触发了自定义验证,所以失败了,因为它没有三个游戏,所以这是行不通的。

有没有办法这么做。如果我无法做到这一点,我只能通过创建嵌套哈希来测试对特定游戏的敏感性,这使得很难看到测试正在做什么,因为关键的更改在哈希中很深。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-05 11:09:47

我不会建议跳过您的验证,即使在您的Rspecs中,除非它是无法避免的。如果可能的话,修改Rspecs以尊重验证。

你可以这样做:

代码语言:javascript
复制
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代码,我们可以尝试修改它以支持验证。

票数 0
EN

Stack Overflow用户

发布于 2018-07-05 10:20:21

可以使用自定义方法来持久化对象。

代码语言:javascript
复制
factory :player do
  to_create {|instance| instance.save(validate: false) }
end

STARTED.md#custom-methods-to-persist-objects

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51187163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档