跳过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条评论
登录后参与评论

相关文章

来自分类常见问题

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用Gradle在IntelliJ中跳过测试

来自分类Dev

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

来自分类Dev

在travis ci中跳过mvn测试-B

来自分类Dev

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

来自分类Dev

before_validation没有被调用?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

ActiveRecord :: Base before_validation没有条件触发

来自分类Dev

在junit测试中跳过一条线

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

before_validation方法不起作用

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

rails 模型回调 before_validation

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    使用Gradle在IntelliJ中跳过测试

  6. 6

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

  7. 7

    在travis ci中跳过mvn测试-B

  8. 8

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

  9. 9

    before_validation没有被调用?

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    ActiveRecord :: Base before_validation没有条件触发

  15. 15

    在junit测试中跳过一条线

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

    before_validation方法不起作用

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

    rails 模型回调 before_validation

  29. 29

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

热门标签

归档