Ruby on rails FactoryGirl Rspec正在创建无效实例
所以我有一个围绕日历上的事件运行的应用程序。事件有开始和结束的时间。增加了一项新要求,以限制仅在将来创建新事件,更具体地说是今天午夜。所以很自然,我修改了validate方法,在实例化时检查它。但是,当使用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
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