Rspec 不识别 RSpec::Matcher 和 RSpec::Core 的任何方法 [英] Rspec don't recognise any method of RSpec::Matcher and RSpec::Core
问题描述
我花了 4 天时间试图正确安装 Ruby on Rails,但我遇到了一个大问题.我第一次使用Linux(对我来说更舒服)但是遇到问题后,我使用了windows.令我惊讶的是,我在 Windows 上也有同样的问题,所以我想我已经禁止了某些东西.如果我尝试为模型加载带有小表单的页面,它会显示一个错误:
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
此外,如果我尝试使用 rspec 对模型执行测试,我会收到许多以下类型的错误:
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:
- 安装 Ruby 2.0.0.
- 安装 Git.
- 安装 Rails(遵循此页面http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-ruby-on-rails-3/).
- 安装 MongoDB(按照此页面http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/).
- 安装 mongoid(添加到 Gemfile 并使用 bundle install).
- 安装 rspec(添加到 Gemfile 并使用 bundle install).
- 执行:rails 生成 rspec:install
我使用的主要文件如下:
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.
提前致谢.
为预留模型添加了 rspec 测试.我已经包含了 rspec 测试的输出.
Added rspec tests for reservation model. I have included the output of the rspec test.
推荐答案
您的 ReservationsControlller
类名中有三个 l
,这就是 Rails 找不到加载控制器文件时的预期控制器类.至于 rspec 问题,也许您缺少一个封闭的 describe
,但请分享您的规范,以便我们了解发生了什么.
You have three l
s 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.
更新:查看您的规范,您已将 subject
设置为 @reservation
,但尚未初始化 @reservation
,因此它的值将是 nil
.此外,由于您使用类 Reservation
作为外部 describe
的参数,主题将隐式为 Reservation.new
而没有 主题
调用.
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.
至于您现在遇到的错误,我不确定.of_type
似乎是在 mongoid-rspec
中定义的,您没有明确包含它,但是您没有从 have_fields
中得到错误,我认为也是在那里定义的.但是,我没有看到 mongoid-rspec
源代码中定义的 have_fields
,所以也许它来自其他地方.无论如何,我会尝试添加 gem 以查看是否可以解决问题.
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.
这篇关于Rspec 不识别 RSpec::Matcher 和 RSpec::Core 的任何方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!