2017-09-24 4 views
0

Ich habe ein Programm, in dem ein Benutzer einen "Piep" posten kann, zusammen mit einem Zeitstempel. Wie kann ich dies mit Capybara testen? Das Problem ist, dass jedes Mal, wenn ein neuer Zeitstrahl erstellt wird, die Zeit unterschiedlich ist. Müsste ich in Capybara eine Art Stub/Mock machen? Hilfe würde sehr geschätzt werden. Vielen Dank.Wie testet man Zeitstempel mit Capybara?

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 

Aufrufe:

<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

Was genau möchten Sie testen? Wie hast du es versucht? Welches Problem holst du? –

Antwort

1

Wenn Sie RSpec verwenden könnten Sie wahrscheinlich so etwas wie:

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 

Ich würde empfehlen, nicht gründlich testen, dass die Funktionalität prov IDD von DataMapper funktioniert wie beabsichtigt, da dies sehr aufwendig wäre. Es ist eine Drittanbieter-Bibliothek, die ebenfalls getestet wird. Das Testen, dass Sie die Zeile property :created_at, DateTime richtig hinzugefügt haben, konnte jedoch mit den obigen Spezifikationen erreicht werden.

2

Wenn dies in einem Capybara angetrieben Feature-Test zu tun, ist die einfachste Lösung ist eine der Zeit zu nutzen, Reisen/Gefrierlösungen wie timecop - https://github.com/travisjeffery/timecop - damit Ihr Test kann in einem Verfahren eingewickelt werden, die die Zeit einfriert.

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 

Hinweis: Wenn das Datum tatsächlich wurde in den Browser von JS gesetzt werden müssten Sie auch so etwas wie sinon.js verwenden auch die Browser-Zeit einzufrieren.