2017-09-24 82 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凍結瀏覽器的時間太長。