ruby-on-rails - 使用 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'
,但没有产生任何结果。
想法?
编辑关于如何在规范中的评论对象上设置日期的背景。
- 创建日期对象
Date.parse
- Timecop冻结时间
- 评论对象被创建
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
解决方案
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 日期时间字符串格式
据我所知,所有浏览器前一段时间都遵循了这一变化。
推荐阅读
- javascript - I get "ReferenceError: window is not defined" even though I check for window
- oracle - OracleDUMP 文件 (.datp) 问题
- node.js - socket.io - .on not working on client side
- google-apps-script - "Bad Request" error for chromeosdevices.list
- java - org.w3c.dom.Element setAttribute("xlink:href", 文件名)
- keras - 如何在嵌入层固定特定权重
- c# - C# CurlSharp EasyGet - 如何获取字符串结果
- c# - 在 C# 中使用 php 'mt_rand' 函数
- amazon-elasticache - 连接到 AWS Elasticache 时,建议使用什么 Redisson 配置来避免超时?
- docker - 对 docker 组合进行版本控制