如何使用水豚测试时间戳?

时间:2017-09-24 13:51:28

标签: ruby-on-rails ruby sinatra capybara

我有一个程序,用户可以在其中发布' 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>

2 个答案:

答案 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,可以通过上述规范来实现。