Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails FactoryGirl Rspec正在创建无效实例_Ruby On Rails_Ruby_Validation_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails FactoryGirl Rspec正在创建无效实例

Ruby on rails FactoryGirl Rspec正在创建无效实例,ruby-on-rails,ruby,validation,rspec,factory-bot,Ruby On Rails,Ruby,Validation,Rspec,Factory Bot,所以我有一个围绕日历上的事件运行的应用程序。事件有开始和结束的时间。增加了一项新要求,以限制仅在将来创建新事件,更具体地说是今天午夜。所以很自然,我修改了validate方法,在实例化时检查它。但是,当使用FactoryGirl使用RSpec进行测试时,这会产生一个问题 很多测试都需要用过去的事件检查某些需求。问题是,我无法再在过去创建这些元素,因为它无法通过我的验证。所以我找到了一些方法来解决这个问题 allow(instance)to receive(:starts_at).and_retu

所以我有一个围绕日历上的事件运行的应用程序。事件有开始和结束的时间。增加了一项新要求,以限制仅在将来创建新事件,更具体地说是今天午夜。所以很自然,我修改了validate方法,在实例化时检查它。但是,当使用FactoryGirl使用RSpec进行测试时,这会产生一个问题

很多测试都需要用过去的事件检查某些需求。问题是,我无法再在过去创建这些元素,因为它无法通过我的验证。所以我找到了一些方法来解决这个问题

allow(instance)to receive(:starts_at).and_return(some_future_time)

下面是应用程序中的一些简单代码

#Model
class Event < ActiveRecord::Base
  validate :check_for_valid_times

  private:
    def check_for_valid_times
      if starts_at.present? && (starts_at < Time.now.at_beginning_of_day)
        errors.add(:base, I18n.t('event.start_time_before_now'))
      end
      unless starts_at.present? && (starts_at < ends_at)
        errors.add(:base, I18n.t('event.end_time_before_start'))'
      end
    end
end
问题是:有没有一种干净的方法可以做到这一点,而不必去处理每个事件的创建,并在我的所有测试中专门处理它们?目前,我不得不以不同的方式处理其中的许多问题

让我知道,如果有其他部分的代码,我应该张贴


一如既往,提前感谢您的帮助

我通常解决这类问题的方法是gem

例如:

Timecop.freeze 1.hour.ago do
  create(:event)
end
然后,您可以将它们放在
let
块中,或者放在
spec/support/events.rb中的助手中,以保持其干燥和可维护

使用timecop,您实际上可以完全模拟测试。因此,请在您关心的过去时间正确创建事件,然后将时间恢复到正常状态,并查看您的测试是否显示事件在过去且无法更改,依此类推。它允许进行完整、准确和可理解的时间敏感测试。RSpec助手、共享上下文和before/let块可以处理保持测试干净的问题

#factory
require 'factory_girl'

FactoryGirl.define do
  factory :event do
    starts_at { 2.hour.from_now.to_s }
  end
end
Timecop.freeze 1.hour.ago do
  create(:event)
end