哈希中时间戳的Rspec出现问题



为了与哈希数据进行比较,我们在规范中有这个

it 'should return the rec_1 in page format' do
expect(response_body_json).to eql(Preseneter.new(ActiveRecordObject).page)
end

Presenter是一个类,它将接受ActiveRecordObject并以特定格式的哈希数据进行响应。

然后我们在hash_data中添加了带有时间戳的updated_at在我的代码中,我有updated_at = Time.zone.now因此,规范开始失败,因为两个updated_at相差几秒。

尝试清除Time.zone

it 'should return the rec_1 in page format' do
allow(Time.zone).to receive(:now).and_return('hello')
expect(response_body_json).to eql(Preseneter.new(ActiveRecordObject).page)
end

但现在response_body_json.updated_at显示为"你好"但右手边仍然有一个时间戳

我哪里错了???或者有其他更好的方法来处理这种情况吗?

由于您还没有展示response_body_jsonPresenter#page是如何定义的,我无法真正回答为什么您当前的尝试不起作用。

然而,我可以说,我会使用不同的方法。

有两种标准的方法来编写这样的测试:

  1. 冻结时间

假设您使用的是相对最新的rails版本,您可以在测试中的某个地方使用ActiveSupport::Testing::TimeHelpers#freeze_time,例如:

around do |example|
freeze_time { example.run }
end
it 'should return the movie_1 in page format' do
expect(response_body_json).to eql(Presenter.new(ActiveRecordObject).page)
end

如果您使用的是较旧的rails版本,则可能需要使用travel_to(Time.zone.now)

如果您使用的是一个非常旧的rails版本(或非rails项目!(,它没有这个辅助库,那么您可以使用timecop

  1. 对时间戳使用模糊匹配器(例如be_within(。大致如下:

it 'should return the movie_1 in page format' do
expected_json = Presenter.new(ActiveRecordObject).page
expect(response_body_json).to match(
expected_json.merge(updated_at: be_within(3.seconds).of(Time.zone.now))
)
end
before do
movie_1.publish
allow(Time.zone).to receive(:now).and_return(Time.now)
get :show, format: :json, params: { id: movie_1.uuid }
end
it 'should return the rec_1 in page format' do
expect(response_body_json).to eql(Preseneter.new(ActiveRecordObject).page)
end

结束

上面的代码解决了我的问题。

看起来我把这个allow(Time.zone).to receive(:now).and_return('hello')放错地方了。它应该放在before块中,以便在测试用例运行之前设置它,我想它可能也必须在get请求之前设置。

然而,Tom Lord的方法是一种更好的方法。

相关内容

  • 没有找到相关文章

最新更新