跳过before_validation:在测试中创建

ll

我在测试一个相当简单的东西时遇到问题,即在数据库中不允许重复代码。

假设我有这个模型:

class Ticket < ActiveRecord::Base
  attr_accessible :code, :series, :sec_code
  validates_uniqueness_of :code, scope:[:series,:sec_code]

  before_validation :generate_codes, on: :create  


  private
  def generate_codes
    self.code=rand.to_s[2..9]  #-> 8 digit code
    self.sec_code=rand.to_s[2..4] #-> 2 digit security code
    self.series=('A'..'Z').to_a.sample #-> one character series
  end

end

然后,我想以这种方式测试唯一性验证是否有效:

require 'spec_helper'

describe Ticket do
  before do
    @ticket=Ticket.create
  end
  subject{@ticket}

  it{ should respond_to(:code)}
  ...

  describe ", duplicate codes" do
    before do
      [email protected]
      #Here lays the problem since this calls `generate_codes` 
      #before saving, so it ends up not being a duplicate!
      dup_ticket.save  #<--- 
    end
    it{ should_not be_valid}
  end

end

我正在考虑使用after_initialize,但是每次实例化对象时都调用此方法,即从数据库中提取对象后,这是不希望的。我想知道,为什么generate_codes即使on: :create在过滤器回调中有一个调用?

ll

jklina答案/评论的启发,我发现update_attribute在这种情况下使用帮助,并且可以在不触发验证之前回调的情况下更新字段。因此测试变成:

require 'spec_helper'

describe Ticket do
  before do
    @ticket=Ticket.create
  end
  subject{@ticket}

  it{ should respond_to(:code)}
  ...

  describe ", duplicate codes" do
    before do
      [email protected]
      dup_ticket.update_attribute(:code, @ticket.code)
      dup_ticket.update_attribute(:sec_code, @ticket.sec_code)
      dup_ticket.update_attribute(:series, @ticket.series)
    end
    it{ should_not be_valid}
  end

end

因此反映了相同的值codesec_codeseries在所述的ActiveRecord表。测试完成了预期的工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

before_validation没有被调用?

来自分类Dev

before_validation方法不起作用

来自分类Dev

rails 模型回调 before_validation

来自分类Dev

正在销毁`before_validation`回调错误代码中的持久记录吗?

来自分类Dev

Ruby的发布字段,因为before_validation中的JSON为JSON

来自分类Dev

具有嵌套属性创建的模型更改了before_validation和before_save之间的关联类型属性

来自分类Dev

在::create或在::save上的rails 4 before_validation

来自分类Dev

ActiveRecord :: Base before_validation没有条件触发

来自分类Dev

在validate_uniqueness_of之前使用before_validation修改值-SystemStackError:堆栈级别太深

来自分类Dev

Rails 4.使用before_validation回调时的奇怪行为

来自分类Dev

如何避免或跳过测试或报告中的测试

来自分类Dev

跳过的测试未在ExtentReport4中记录为跳过

来自分类Dev

使用Gradle在IntelliJ中跳过测试

来自分类Dev

从testng执行中删除跳过的测试结果

来自分类Dev

在travis ci中跳过mvn测试-B

来自分类Dev

如何跳过或忽略TestNG中的测试执行

来自分类Dev

以编程方式跳过Spock中的测试

来自分类Dev

BufferedReader跳过测试/测验中的问题

来自分类Dev

以编程方式跳过 RSpec 中的测试

来自分类Dev

通用测试类中针对特定类型的跳过测试方法

来自分类Dev

Android单元测试跳过测试类中的行

来自分类Dev

是否可以跳过HSpec测试套件中的测试?

来自分类Dev

在测试中,jUnit跳过方法injectmock中的方法调用

来自分类Dev

如何在行为python BDD框架中跳过测试?

来自分类Dev

在junit测试中跳过一条线

来自分类常见问题

如何在Django中跳过单元测试?

来自分类Dev

跳过单元测试中的内部方法调用

来自分类Dev

在@DataProvider方法中引发异常后,TestNG跳过测试

来自分类Dev

如何跳过PHPUnit中的前N个测试?

Related 相关文章

  1. 1

    before_validation没有被调用?

  2. 2

    before_validation方法不起作用

  3. 3

    rails 模型回调 before_validation

  4. 4

    正在销毁`before_validation`回调错误代码中的持久记录吗?

  5. 5

    Ruby的发布字段,因为before_validation中的JSON为JSON

  6. 6

    具有嵌套属性创建的模型更改了before_validation和before_save之间的关联类型属性

  7. 7

    在::create或在::save上的rails 4 before_validation

  8. 8

    ActiveRecord :: Base before_validation没有条件触发

  9. 9

    在validate_uniqueness_of之前使用before_validation修改值-SystemStackError:堆栈级别太深

  10. 10

    Rails 4.使用before_validation回调时的奇怪行为

  11. 11

    如何避免或跳过测试或报告中的测试

  12. 12

    跳过的测试未在ExtentReport4中记录为跳过

  13. 13

    使用Gradle在IntelliJ中跳过测试

  14. 14

    从testng执行中删除跳过的测试结果

  15. 15

    在travis ci中跳过mvn测试-B

  16. 16

    如何跳过或忽略TestNG中的测试执行

  17. 17

    以编程方式跳过Spock中的测试

  18. 18

    BufferedReader跳过测试/测验中的问题

  19. 19

    以编程方式跳过 RSpec 中的测试

  20. 20

    通用测试类中针对特定类型的跳过测试方法

  21. 21

    Android单元测试跳过测试类中的行

  22. 22

    是否可以跳过HSpec测试套件中的测试?

  23. 23

    在测试中,jUnit跳过方法injectmock中的方法调用

  24. 24

    如何在行为python BDD框架中跳过测试?

  25. 25

    在junit测试中跳过一条线

  26. 26

    如何在Django中跳过单元测试?

  27. 27

    跳过单元测试中的内部方法调用

  28. 28

    在@DataProvider方法中引发异常后,TestNG跳过测试

  29. 29

    如何跳过PHPUnit中的前N个测试?

热门标签

归档