dennismonsewicz
dennismonsewicz

Reputation: 25542

Rspec and testing instance methods

Here is my rspec file:

require 'spec_helper'

describe Classroom, focus: true do

  describe "associations" do
    it { should belong_to(:user) }
  end

  describe "validations" do
    it { should validate_presence_of(:user) }
  end

  describe "instance methods" do

    describe "archive!" do
      before(:each) do
        @classroom = build_stubbed(:classroom)
      end

      context "when a classroom is active" do
        it "should mark classroom as inactive" do
          @classroom.archive!
          @classroom.active.should_be == false
        end
      end

    end

  end

end

Here is my Classroom Factory:

FactoryGirl.define do

  factory :classroom do
    name "Hello World"
    active true

    trait :archive do
      active false
    end
  end

end

When the instance method test runs above, I receive the following error: stubbed models are not allowed to access the database

I understand why this is happening (but my lack of test knowledge/being a newb to testing) but can't figure out how to stub out the model so that it doesn't hit the database

Working Rspec Tests:

require 'spec_helper'

describe Classroom, focus: true do

  let(:classroom) { build(:classroom) }

  describe "associations" do
    it { should belong_to(:user) }
  end

  describe "validations" do
    it { should validate_presence_of(:user) }
  end

  describe "instance methods" do

    describe "archive!" do

      context "when a classroom is active" do
        it "should mark classroom as inactive" do
          classroom.archive!
          classroom.active == false
        end
      end

    end

  end

end

Upvotes: 0

Views: 3272

Answers (1)

PinnyM
PinnyM

Reputation: 35533

Your archive! method is trying to save the model to the database. And since you created it as a stubbed model, it doesn't know how to do this. You have 2 possible solutions for this:

  • Change your method to archive, don't save it to the database, and call that method in your spec instead.
  • Don't use a stubbed model in your test.

Thoughtbot provides a good example of stubbing dependencies here. The subject under test (OrderProcessor) is a bona fide object, while the items passed through it are stubbed for efficiency.

Upvotes: 1

Related Questions