2016-11-11 1 views
2

Я со следующей проблемой:RSpec и Factory Girl - Ошибка с поля даты и времени

окружающей среды: Ruby: 2.3.1 и Rails 5.0.0.1

Я пытаюсь проверить поля даты и времени с RSpec и Factory Girl.

Я получил эту ошибку:

expected: "2016-11-11 13:30:31 UTC" (From Factory Girl) 
    got: "2016-11-11T13:30:31.218Z" (From database) 

Мой код:

klass_object = FactoryGirl.create (: символ)

Klass = Character

RSpec.shared_examples 'API GET #index' do |klass| 
    before { get :index, params: params, accept: Mime[:json] } 


    it "returns a list of #{klass.to_s.underscore.pluralize}" do 
    object_array = json(response.body) 

    klass_attributes = klass.attribute_names.without("id", "created_at", "updated_at").map(&:to_sym) 

    klass_attributes.each do |attribute| 
     object_array.each do |object| 
     expect(object[attribute].to_s).to eq(klass_object[attribute].to_s) 
     end 
    end 
    end 
    ... 
end 

Фабрика:

FactoryGirl.define do 
    factory :character do 
    marvel_id { Faker::Number.number(6).to_i } 
    name { Faker::Superhero.name } 
    description { Faker::Hipster.paragraphs(1) } 
    modified { Faker::Date.between(DateTime.now - 1, DateTime.now) } 

    factory :invalid_character do 
     id '' 
     name '' 
     marvel_id '' 
     modified '' 
    end 
    end 

конец

Как исправить эту проблему?

Я сделал это, он работает, но я думаю, что это не так хорошо. Есть лучший способ сделать это?

object_array.each do |object| 
     if ActiveSupport::TimeWithZone == klass_object[attribute].class 
     expect(object[attribute].to_datetime.strftime("%Y-%m-%d %H:%M:%S")).to eq(klass_object[attribute].to_datetime.strftime("%Y-%m-%d %H:%M:%S")) 
     else 
     expect(object[attribute].to_s).to eq(klass_object[attribute].to_s) 
     end 
    end 

Благодарим за помощь.

ответ

0

Попробуйте использовать вместо to_datetimeto_s

expect(object[attribute].to_datetime).to eq(klass_object[attribute].to_datetime) 
+0

В этом случае я выполняю цикл для каждого атрибута класса. Таким образом, не все атрибуты являются датами. –

2

Я могу предложить вам изменить свой подход, чтобы сравнить результаты. Вы можете использовать подход, основанный на идее золотого мастера.

В соответствии с этим подходом вы делаете снимок объекта, а затем сравниваете все будущие версии объекта с моментальным снимком.

В вашем случае вы можете сначала написать json fixture, проверить правильность json и сравнить его с результатом json в следующий раз.

Например

approved.json

[ 
    { 
    "travel_time_seconds": 43200, 
    "available_seats_amount": 10, 
    "departure_at": "2016-04-08T02:00:00.000+03:00", 
    "arrival_at": "2016-04-08T17:00:00.000+03:00", 
    "source_point_name": "New York", 
    "destination_point_name": "Moscow", 
    "tickets_count": 2 
    } 
] 

controller_spec.rb

RSpec.shared_examples 'API GET #index' do |klass| 
    before { get :index, params: params, accept: Mime[:json] } 

    it "returns a list of #{klass.to_s.underscore.pluralize}" do 
    verify(format: :json) { json(response.body).map {|o| o.except('id', 'created_at', 'updated_at' } 
    end 
    ... 
end 

approvals gem, например, может помочь у ou с этим