首页 > 解决方案 > 使用 MomentJS 格式化的 RSpec 测试 Rails 日期

问题描述

关于在 Rails 应用程序中测试日期/时间,我们有一个奇怪的(时区?)问题。

正在测试的日期created_at在 Rails 对象上。

在前端(.html.slim带有一些 AngularJS 的页面)

span.date
  | {{ comment.createdAt }}

渲染:

2017-01-03T00:00:00.000Z

但...

span.date
  | {{ comment.createdAt | moment: 'MMMM Do, YYYY' }}

渲染:

January 2nd, 2017

我们在期待January 3rd, 2017

我已经尝试过moment.utc: 'MMMM Do, YYYY',但没有产生任何结果。

想法?

编辑关于如何在规范中的评论对象上设置日期的背景。

  1. 创建日期对象Date.parse
  2. Timecop冻结时间
  3. 评论对象被创建
  4. Comment.created_at在页面上呈现,但已针对本地时间进行了调整(这是预期行为)

也许在 Timecop 被冻结的情况下,有一种更好的设置方法,current_date这样当momentJS thaws出来时,它与正在运行测试的机器位于同一时区?!?

let!(:current_date) { Date.parse('2017-01-03') }
...
background do
  Timecop.freeze(current_date)
end
...
context 'for story' do
  background do
    open_story_comments_modal

    within '.story-comments-container' do
      add_comment 'First comment message'
    end
  end
...

在一个共享的助手中,我们有

  def add_comment(text)
    fill_in 'comment[body]', with: text
    find('input[name="comment[body]"]').send_keys(:enter)

    expect(page).to have_css '.comments .comment-body', text: text
  end

标签: ruby-on-railsrspecmomentjs

解决方案


2017-01-03T00:00:00.000Z是一个 ISO 8601 日期字符串。最后Z的 表示它在 UTC 时区。根据地区时区,该日期可能是 1 月 3 日或 1 月 2 日。

存储带有时间和时区的日期通常是一个好主意,但在某些极端情况下并非如此。如果要存储一天,则不应存储时间,也不得存储时区。没有时区的日期字符串被认为是本地时间:

如果不存在时区偏移量,则日期时间将被解释为本地时间。

ECMAScript 2015(第 6 版):20.3.1.16 日期时间字符串格式

请注意,自 ECMAScript 2015(第 6 版)以来,这已经发生了变化。直到之前它被指定为相反的:

缺席时区偏移的值为“Z”。

ECMAScript 5.1 版/2011 年 6 月:15.9.1.15 日期时间字符串格式

据我所知,所有浏览器前一段时间都遵循了这一变化。


推荐阅读