jesusgonzalezrivera
jesusgonzalezrivera

Reputation: 385

Rspec don't recognise any method of RSpec::Matcher and RSpec::Core

I have spent 4 days trying to install Ruby on Rails properly but I have a big problem. The first time I used Linux (it's more confortable for me) but, after having a problem, I used windows. To my surprise, I have the same issue on Windows, so I suppose that I have forbidden something. If I try to load a page with a small form for a model, it shows me an error that says:

Unable to autoload constant ReservationsController, expected ...../app/controllers/reservations_controller.rb to define it

Also, if I try to execute a test for a model with rspec, I receive a lot of errors of the following type:

$ rspec spec/models/reservation_spec.rb 
FFFFF

Failures:

  1) Reservation Fields 
     Failure/Error: it{ should have_fields( :from_date ).of_type( Date ) }
     NoMethodError:
       undefined method `of_type' for #<RSpec::Matchers::BuiltIn::Has:0x915ebc8>
     # ./spec/models/reservation_spec.rb:7:in `block (3 levels) in <top (required)>'

  2) Reservation Fields 
     Failure/Error: it{ should have_fields( :price ).of_type( Float ) }
     NoMethodError:
       undefined method `of_type' for #<RSpec::Matchers::BuiltIn::Has:0x9423cc8>
     # ./spec/models/reservation_spec.rb:10:in `block (3 levels) in <top (required)>'

  3) Reservation Fields 
     Failure/Error: it{ should have_fields( :room ).of_type( String ) }
     NoMethodError:
       undefined method `of_type' for #<RSpec::Matchers::BuiltIn::Has:0x94d5bbc>
     # ./spec/models/reservation_spec.rb:11:in `block (3 levels) in <top (required)>'

  4) Reservation Fields 
     Failure/Error: it{ should have_fields( :until_date ).of_type( Date ) }
     NoMethodError:
       undefined method `of_type' for #<RSpec::Matchers::BuiltIn::Has:0x952cb60>
     # ./spec/models/reservation_spec.rb:8:in `block (3 levels) in <top (required)>'

  5) Reservation Fields 
     Failure/Error: it{ should have_fields( :number_of_persons ).of_type( Integer ) }
     NoMethodError:
       undefined method `of_type' for #<RSpec::Matchers::BuiltIn::Has:0x957bbc0>
     # ./spec/models/reservation_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.16437 seconds
5 examples, 5 failures

Failed examples:

rspec ./spec/models/reservation_spec.rb:7 # Reservation Fields 
rspec ./spec/models/reservation_spec.rb:10 # Reservation Fields 
rspec ./spec/models/reservation_spec.rb:11 # Reservation Fields 
rspec ./spec/models/reservation_spec.rb:8 # Reservation Fields 
rspec ./spec/models/reservation_spec.rb:9 # Reservation Fields 

Randomized with seed 18738

The steps that I have followed to install rails are the following:

The main files that I have used are the following:

Gemfile

source 'https://rubygems.org'
require 'mongo'
source 'http://gemcutter.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0'
gem 'mongo_mapper'

gem "rspec-rails", :group => [:development, :test]
group :test do
  gem 'database_cleaner'
end

gem 'json',         '~> 1.8.0'  # Gem to support json
gem 'haml',         '~> 4.0.3'  # Gem to support haml views

gem 'mongo',        '~> 1.9.1'  # Gem to use mongodb
gem 'mongoid', git: 'https://github.com/mongoid/mongoid.git'

gem 'rake',         '~> 10.1.0' # Gem to use rake (rspec and cucumber)
gem 'cucumber',     '~> 1.3.5'  # Gem to test with cucumber
gem 'capybara',     '~> 2.1.0'  # Gem to use capybara in cucumber tests
gem 'wait_for',     '~> 0.1.1'  # Gem to wait for an apparition in cucumber tests
gem 'factory_girl', '~> 4.2.0'  # Gem to create examples data

group :assets do
  gem 'sass-rails',   '~> 4.0.0'
  gem 'coffee-rails', '~> 4.0.0'
  gem 'uglifier',     '~> 2.1.2'
end

mongoid.yml

development:
  sessions:
    default:
      database: hotel_development
      hosts:
        - localhost:27017
      options:
  options:
test:
  sessions:
    default:
      database: hotel_test
      hosts:
        - localhost:27017
      options:
        consistency: :strong
        max_retries: 1
        retry_interval: 0

mongo.rb

MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.database = "#myapp-#{Rails.env}"

if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    MongoMapper.connection.connect if forked
  end
end

reservation.rb

class Reservation
  include Mongoid::Document

  field :from_date, type: Date
  field :until_date, type: Date
  field :number_of_persons, type: Integer
  field :price, type: Float
  field :room, type: String

  has_one :client
end

reservations_controller.rb

class ReservationsControlller < ApplicationController
  def show
    @user = User.find( params[:id] )
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new( params[:user] )
    if @user.save
      redirect_to @user
    else
      render 'new'
    end
  end
end

routes.rb

Hotel::Application.routes.draw do
  resources :reservations, only: [:show, :new, :create]
end

reservation_spec.rb

require 'spec_helper'

describe Reservation do
  subject{ @reservation }

  describe "Fields" do
    it{ should have_field( :from_date ).of_type( Date ) }
    it{ should have_field( :until_date ).of_type( Date ) }
    it{ should have_field( :number_of_persons ).of_type( Integer ) }
    it{ should have_field( :price ).of_type( Float ) }
    it{ should have_field( :room ).of_type( String ) }
  end
end

If you need another file I can put without problems.

Thanks in advance.

EDIT: Added rspec tests for reservation model. EDIT2: I have included the output of the rspec test.

Upvotes: 1

Views: 3196

Answers (1)

Peter Alfvin
Peter Alfvin

Reputation: 29449

You have three ls in your ReservationsControlller class name, which is why Rails is not finding the expected controller class when it loads the controller file. As for the rspec problem, perhaps you're missing an enclosing describe, but please share your spec so that we can see what's going on.

Update: Looking at your spec, you've set your subject to @reservation, but haven't initialized @reservation, so it's value will be nil. Also, since you used the class Reservation as the argument to the outer describe, the subject would implicitly be Reservation.new without the subject call.

As for the errors you're now getting, I'm not sure. of_type seems to be defined in mongoid-rspec, which you haven't explicitly included, but you're not getting an error from have_fields, which I thought was defined there as well. I don't see have_fields defined in the mongoid-rspec source, however, so perhaps that's coming from somewhere else. Anyway, I'd try adding the gem to see if that takes care of the problem.

Upvotes: 6

Related Questions