我有一个程序,用户可以在其中发布' peep'以及时间戳。我如何使用水豚进行测试?问题是每次创建新的时间条件时,时间都不同。我是否必须在水豚中创建某种存根/模拟?非常感谢帮助。谢谢。
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>
答案 0 :(得分:2)
如果在水豚驱动的功能测试中执行此操作,最简单的解决方案是使用其中一个时间旅行/冻结解决方案,例如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
的内容来冻结浏览器时间。
答案 1 :(得分:1)
如果您正在使用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
,可以通过上述规范来实现。