I am testing an RSpec model called "Solutions" which has many Likes. The solution stores as much as he likes (counter_cache). It has the attribute "likes_count" (and the corresponding db field).
When I create a Like record related to the solution, I expect the decision attribute βlikes_countβ to be updated from zero to 1. When I do this in the console, it works.
But when I run the specification, doing the SAME that I do in the console, it updates the TWICE field "likes_count", setting it to 2.
See (in the console) WORK :
irb(main):001:0> solution = Factory(:solution) irb(main):004:0> solution.likes_count => nil irb(main):006:0> like = Factory(:like, :likeable => solution) => #<Like id: 1, user_id: 2, likeable_id: 1, likeable_type: "Solution", created_at: "2011-11-23 19:31:23", updated_at: "2011-11-23 19:31:23"> irb(main):007:0> solution.reload.likes_count => 1
Take a look at the result of the specification DOES NOT WORK :
1) Solution counter cache should be increased when a like is created Failure/Error: subject.reload.likes_count.should be 1 expected
Here is the specification:
describe "counter cache" do let(:solution) { Factory(:solution) } it "should be increased when a like is created" do Factory(:like, :likeable => solution) solution.reload.likes_count.should be 1 end end
I took a look at test.log, and I realized that the db query, which updates the counter cache column, is called twice in the test.
SQL (0.5ms) INSERT INTO "likes" ("created_at", "likeable_id", "likeable_type", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?) [["created_at", Wed, 23 Nov 2011 19:38:31 UTC +00:00], ["likeable_id", 121], ["likeable_type", "Solution"], ["updated_at", Wed, 23 Nov 2011 19:38:31 UTC +00:00], ["user_id", 204]] SQL (0.3ms) UPDATE "solutions" SET "likes_count" = COALESCE("likes_count", 0) + 1 WHERE "solutions"."id" IN (SELECT "solutions"."id" FROM "solutions" WHERE "solutions"."id" = 121 ORDER BY id DESC) SQL (0.1ms) UPDATE "solutions" SET "likes_count" = COALESCE("likes_count", 0) + 1 WHERE "solutions"."id" IN (SELECT "solutions"."id" FROM "solutions" WHERE "solutions"."id" = 121 ORDER BY id DESC) Solution Load (0.3ms) SELECT "solutions".* FROM "solutions" WHERE "solutions"."id" = ? LIMIT 1 [["id", 121]]