2017-09-24 85 views
0

我有一个程序,用户可以在该程序中发布“窥视”,以及时间戳。我如何使用水豚测试这个?问题是每次创建新的时间标记时,时间都不相同。我需要在水豚中创建某种存根/模拟吗?帮助将不胜感激。谢谢。如何使用水豚测试时间戳?

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

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冻结浏览器的时间太长。