Search code examples
rspec2rspec-rails

Rspec new expectation syntax


I've the following rspec unit test:

require 'spec_helper'

describe Article do
  describe ".recents" do
    it "includes articles created less than one week ago" do
      article = Article.create(created_at: Date.today - 1.week + 1.second)
      expect(Article.recents).to eql([article])
    end

    it "excludes articles published at midnight one week ago" do
      article = Article.create!(:created_at => Date.today - 1.week)
      expect(Article.recents).to be_empty
    end

  end
end

and the Articlemodel:

class Article < ActiveRecord::Base
  attr_accessible :description, :name, :price, :created_at

  scope :recents, where('created_at <= ?', 1.week.ago)
end

when I run my tests I get:

1) Article.recents includes articles created less than one week ago
     Failure/Error: expect(Article.recents).to eql([article])

       expected: [#<Article id: 60, name: nil, description: nil, price: nil, created_at: "2012-11-14 00:00:01", updated_at: "2012-11-21 10:12:33", section_id: nil>]
            got: [#<Article id: 60, name: nil, description: nil, price: nil, created_at: "2012-11-14 00:00:01", updated_at: "2012-11-21 10:12:33", section_id: nil>]

       (compared using eql?)

       Diff:#<ActiveRecord::Relation:0x007ff692bce158>.==([#<Article id: 60, name: nil, description: nil, price: nil, created_at: "2012-11-14 00:00:01", updated_at: "2012-11-21 10:12:33", section_id: nil>]) returned false even though the diff between #<ActiveRecord::Relation:0x007ff692bce158> and [#<Article id: 60, name: nil, description: nil, price: nil, created_at: "2012-11-14 00:00:01", updated_at: "2012-11-21 10:12:33", section_id: nil>] is empty. Check the implementation of #<ActiveRecord::Relation:0x007ff692bce158>.==.
     # ./spec/models/article_spec.rb:7:in `block (3 levels) in <top (required)>'

Could someone please help me to figure out what's the error in my test?

It seems good for me.


Solution

  • You are comparing an activerecord relation (Article.recents) to an array ([article]), which is why the expectation is failing. (It looks like they are the same in the spec results because inspect converts the relation into an array before printing it out.)

    Change your first expectation to this:

    expect(Article.recents.to_a).to eql([article])