【问题标题】:rspec - testing validations and want to turn off callbacksrspec - 测试验证并想要关闭回调
【发布时间】:2012-01-08 22:48:32
【问题描述】:

我有一个具有这样关系的模型:

class Category < ActiveRecord::Base
 has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :category
  before_save :default_values
  validates_presence_of :header

  def default_values
    if self.category.cat_is_enabled==true
      self.is_enabled=true
    end
  end
end

我只想检查 validates_presence_of :

需要'spec_helper'

describe Item do
  pending "add some examples to (or delete) #{__FILE__}"
  it "should have a header value" do
    mi=Item.create(:header => "").should_not be_valid
  end
end

但是对于“nil:NilClass 的未定义方法 `cat_is_enabled'”,我收到了一个错误。我将如何关闭默认值?有没有更好的方法来测试验证?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 rspec


    【解决方案1】:

    这是一个想法:

    代码

    class ActiveRecord::Base
      def self.without_callback(callback, &block)
        method = self.send(:instance_method, callback)
        self.send(:remove_method, callback)
        self.send(:define_method, callback) {true}
        yield
        self.send(:remove_method, callback)
        self.send(:define_method, callback, method)
      end
    end 
    

    用法

    Item.without_callback(:before_save) do
        mi = Item.create(:header => "").should_not be_valid
    end
    

    信用:article from Intridea.

    【讨论】:

    • hmm...这只会存在于测试中——有没有办法不引入额外的代码(即类别总是存在的)。善意的大声思考
    • 最好地回答问题(我学到了一点关于红宝石猴子补丁的知识)。可能应该在其他中使用 sol'n 来测试有效性
    【解决方案2】:

    我认为您根本不需要尝试保存记录来测试此验证,并且您通常应该避免接触数据库而不是在测试中。

      it "should have a header value" do
        mi=Item.new(:header => "").should_not be_valid
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多