由于created_at,无法通过spec测试

时间:2013-12-27 09:15:29

标签: ruby-on-rails rspec

我正在测试'get'方法并收到错误:

预期:

  

[{\ “USER_ID \”:11,\ “USER_FIRST_NAME \”:\ “鲍勃\”,\ “user_last_name \”:\ “马利\”,\ “user_picture \”:\“/图片/缺失。 PNG \ “\ ”ID \“:2,\ ”文本\“:\” 我   第三次评论\“,\”date \“:\”2013-12-27T09:08:06.364Z \“}]

得到:

  

[{\ “USER_ID \”:11,\ “USER_FIRST_NAME \”:\ “鲍勃\”,\ “user_last_name \”:\ “马利\”,\ “user_picture \”:\“/图片/缺失。 PNG \ “\ ”ID \“:2,\ ”文本\“:\” 我   第三次评论\“,\”date \“:\”2013-12-27T09:08:06.000Z \“}]

怎么了?为什么最后一个数字不同而其他所有字段都相同?

it "should return reviews for user" do
    review = Review.create(reviewer_id: @user.id, user_id: @user2.id, text: 'my third review')
    get 'get_reviews_for_user', user_id: @user2.id
    expect(response).to be_success
    json = JSON.parse(response.body)
    expect(json['reviews'].to_json).to eq([{user_id: @user.id, 
                                            user_first_name: @user.first_name, 
                                            user_last_name: @user.last_name,
                                            user_picture: @user.picture.url(:thumb),
                                            id: review.id,
                                            text: review.text,
                                            date: review.created_at
                                            }].to_json)
  end

在控制器中:

def get_reviews_for_user
    user = User.where(id: params[:user_id]).first
    return render json: {success: false} if user.nil?
    reviews = []
    Review.where(user_id: user.id).each do |review|
      reviewer = review.reviewer
      reviews << {user_id: reviewer.id, 
                  user_first_name: reviewer.first_name, 
                  user_last_name: reviewer.last_name,
                  user_picture: reviewer.picture.url(:thumb),
                  id: review.id,
                  text: review.text,
                  date: review.created_at}
    end
    render json: { success: true, reviews: reviews }
  end

2 个答案:

答案 0 :(得分:4)

时间不同,因为当时间转换为JSON时,毫秒被截断。

答案 1 :(得分:3)

您可以使用Timecop冻结给定值的时间,如下所示:Timecop.freeze(Time.now)

您也可以使用这样的存根(在测试中):

allow(Review).to receive(:where).with(user_id: @user.id).and_return([review])
allow(review).to receive(:created_at).and_return(Time.now)