如何使用水豚测试时间戳?
问题描述:
我有一个程序,用户可以在该程序中发布“窥视”,以及时间戳。我如何使用水豚测试这个?问题是每次创建新的时间标记时,时间都不相同。我需要在水豚中创建某种存根/模拟吗?帮助将不胜感激。谢谢。如何使用水豚测试时间戳?
class Peep
include DataMapper::Resource
property :id, Serial
property :title, String
property :text, String
property :created_at, DateTime
end
DataMapper.setup(:default, "postgres://localhost/chitter_#{ENV['RACK_ENV']}")
DataMapper.finalize
DataMapper.auto_upgrade!
App.rb:
require 'data_mapper'
require 'sinatra/base'
require 'sinatra/flash'
require_relative './models/peep.rb'
require_relative './models/user.rb'
ENV["RACK_ENV"] ||= "development"
class Chitter < Sinatra::Base
enable :sessions
register Sinatra::Flash
set :session_secret, 'super secret'
get '/' do
'You arrived at the homepage'
end
get '/peeps' do
@peeps = Peep.all
erb(:index)
end
get '/peeps/new' do
erb(:new)
end
get '/users/new' do
@user = User.new
erb(:'users/new')
end
post '/users' do
@user = User.create(email: params[:email],
password: params[:password],
password_confirmation: params[:password_confirmation])
if @user.save
session[:user_id] = @user.id
redirect to('/peeps')
else
flash.now[:errors] = @user.errors.full_messages
erb(:'users/new')
end
end
post '/peeps' do
peep = Peep.new(title: params[:title], text: params[:text])
peep.save
redirect to('/peeps')
end
helpers do
def current_user
@current_user ||= User.get(session[:user_id])
end
end
run! if app_file == $PROGRAM_NAME
end
浏览:
<h1> Peeps </h1>
<ul id='peeps'>
<% @peeps.reverse.each do |peep| %>
<li id="peeps">
Title: <%= peep.title %>
Text: <%= peep.text %>
created_at: <%= peep.created_at %>
</li>
<% end %>
</ul>
答
如果您使用的RSpec你也许可以这样做:
RSpec.describe Peep do
let(:peep) { Peep.create(title: "My title", text: "Some text") }
describe "#created_at" do
it { expect(peep).to respond_to(:created_at) }
it { expect(peep.created_at).to be_kind_of(DateTime) }
end
end
我会建议没有彻底测试的功能提供由DataMapper根据预期工作,因为这样做会非常复杂。这是一个也经过测试的第三方库。然而,测试您已经正确添加了行property :created_at, DateTime
,可以通过上述规格来实现。
答
如果在水豚驱动功能测试这样做,最简单的解决方案是使用的时间一移行/冷冻解决方案,如timecop
- https://github.com/travisjeffery/timecop - 让您的测试可以在冻结时间的方法来包装。
Timecop.freeze(specific_datetime) do
# fill out form
...
# submit form
...
expect(page).to have_content("created_at: #{specific_datetime.tos}") # format the specific_datetime as expected
end
注:如果日期竟是被在浏览器中通过JS设置你也需要使用像sinon.js
冻结浏览器的时间太长。
你究竟想要测试什么?你如何尝试过?你提取什么问题? –