RSpec:如何模拟 SQL NOW()

ins*_*ero 6 sql rspec ruby-on-rails mocking

我可以Time.now用很棒的时间警察宝石来嘲笑。

Time.now
 => 2018-05-13 18:04:46 +0300

Timecop.travel(Time.parse('2018.03.12, 12:00'))

Time.now
 => 2018-03-12 12:00:04 +0300

TeacherVacation.first.ends_at
Thu, 15 Mar 2018 12:00:00 MSK +03:00

TeacherVacation.where('ends_at > ?', Time.now).count
1
Run Code Online (Sandbox Code Playgroud)

NOW()但是(显然)这在查询中使用时不起作用:

TeacherVacation.where('ends_at > NOW()').count
0
Run Code Online (Sandbox Code Playgroud)

我可以模拟NOW()以便它在特定时间内返回结果吗?

Asl*_*aev -3

我认为解决这个问题的方法是DI(依赖注入)

def NOW(time = Time.now)
  time
end
Run Code Online (Sandbox Code Playgroud)

测试中

current_test = Time.new(2018, 5, 13)
p NOW(current_test)
Run Code Online (Sandbox Code Playgroud)

生产中

p NOW
Run Code Online (Sandbox Code Playgroud)

  • 我不太明白你的回答。`NOW()` 不是一个 ruby​​ 函数,它是一个 SQL 函数。 (4认同)