Minitest ruby 中的模拟或存根日期时间

问题描述 投票:0回答:3

我正在用户模型上实现last_active_at属性,每次用户访问网站上的页面时该属性都会更新。

当尝试在日期时间上使用模拟来测试此属性的设置时,我得到一个

NoMethodError: undefined method 'expect' for DateTime:Class

这是我在文件chapter_controller_test.rb中的测试:

test "save user last activity timestamp" do
  user = FactoryGirl.create(:user, student_type: User::REMOTE)
  session[:user_id] = user.id
  some_date = DateTime.new(2014, 12, 12, 1, 1, 1)
  DateTime.expect(:now, some_date)
  get :index
  assert_equal(some_date, user.last_active_at)
end

以及ApplicationController中的实现:

before_filter :record_activity

def record_activity
  if current_user && current_user.remote?
    current_user.last_active_at = DateTime.now
    current_user.save
  end
end

我正在使用minitest 5.1

ruby-on-rails ruby datetime mocking minitest
3个回答
4
投票

这是最小的,但对于 Rails(你的情况),从 4.1 开始你可以使用

travel_to

travel_to Date.new(1986, 10, 25) do
  Date.current == Date.new(1985, 10, 25) # Marty! You've gotta come back with me!
end

1
投票

恐怕你不能这样使用

expect
。尝试这样的事情:

test "save user last activity timestamp" do
  user = FactoryGirl.create(:user, student_type: User::REMOTE)
  session[:user_id] = user.id
  some_date = DateTime.new(2014, 12, 12, 1, 1, 1)
  DateTime.stub :now, some_date do
    get :index
    assert_equal(some_date, user.last_active_at)
  end
end

我目前无法自行检查,但请尝试一下!

祝你好运!


1
投票

我终于成功地使用 gem mocha 进行了存根(在这种情况下比模拟更有趣),我的测试现在看起来像这样:

test "save user last activity timestamp" do
  user = FactoryGirl.create(:user, student_type: User::REMOTE)
  session[:user_id] = user.id
  some_date = DateTime.new(2014, 12, 12, 1, 1, 1)
  DateTime.stubs(:now).returns(some_date)
  get :index
  user.reload
  assert_equal(some_date, user.last_active_at)
end

对我来说效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.