Question

I'm trying different blogs with examples of Rails 3 and RSpec. Yes it's on Windows, so the answer isn't not using Windows. No choice in that. Moving on...

I am able to run the spec either with rspec spec or rake spec:models so that seems fine. However if I try to use a before block with attributes it fails on creating a Person class with those attributes. The other tests are just there to show spec can run.

Made a Person model then updated the spec

\myapp\spec\models\person_spec.rb

require 'spec_helper'

describe Person do

  before(:each) do
    @valid_attributes = {
      :first_name => "Foo", 
      :last_name => "Bar"
    }
  end

  it "should create a new instance given valid attributes" do
    Person.create!(@valid_attributes)
  end

  it "can be instantiated" do
    Person.new.should be_an_instance_of(Person)
  end

  it "can be saved successfully" do
    Person.create.should be_persisted
  end



  #pending "add some examples to (or delete) #{__FILE__}"
end

Here's the output of rake spec:models command

C:\Users\laptop\Documents\Sites\myapp>rake spec:models
C:/Ruby193/bin/ruby.exe -S rspec ./spec/models/person_spec.rb

Person
←[31m  should create a new instance given valid attributes (FAILED - 1)←[0m
←[32m  can be instantiated←[0m
←[32m  can be saved successfully←[0m

Failures:

  1) Person should create a new instance given valid attributes
     ←[31mFailure/Error:←[0m ←[31mPerson.create!(@valid_attributes)←[0m
     ←[31mActiveRecord::UnknownAttributeError:←[0m
       ←[31munknown attribute: first_name←[0m
←[36m     # ./spec/models/person_spec.rb:13:in `block (2 levels) in <top (required)>'←[0m

Finished in 0.074 seconds
←[31m3 examples, 1 failure←[0m

Failed examples:

←[31mrspec ./spec/models/person_spec.rb:12←[0m ←[36m# Person should create a new instance given valid attributes←[0m
rake aborted!
C:/Ruby193/bin/ruby.exe -S rspec ./spec/models/person_spec.rb failed

So two out of three passed just not the one with attributes.

Anything in particular that would need to be setup for a before block to run or how are attributes passed in a test with Rails 3?

Also is there a way to get rid of those ]31m and such printouts for each spec line?

Thanks

Was it helpful?

Solution 2

I should update this with the answer.

The Person model did in fact contain first_name and last_name but as noted by two people above the error I was receiving pointed to ActiveRecord not finding it.

In Windows, running rake db:migrate two or three times eventually fixed it even though it wasn't missing in the model.

If you're stuck on Windows dev, this may be a good thing to know!

I finally was able to put Lubuntu on a VirtualBox on Windows 7 and it ran fine and since then I have proceeded with other examples from there.

Cheers

OTHER TIPS

It would appear from the error that ActiveRecord can't find the attribute :first_name that you are passing as part of @valid_attributes. That is, the problem isn't with how you are using RSpec, but with the attributes you are expecting a valid model to contain.

Check that you have a :first_name field or attribute on the Person model - and verify the exact spelling (:first_name vs :firstname or some other variation)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top