问题
I am writing a spec to test the behavior of the mashup_controller when someone sends a query through a URL. I need to simulate the parameters contained in the URL, and i read that the post() method will do that, however when i get an error:
1) MashupController simulates query
Failure/Error: post :create
NoMethodError:
undefined method `post' for
#<RSpec::Core::ExampleGroup::Nested_1:0x980bc50>
# ./mashup_controller_rspec.rb:9:in `block (2 levels) in <top (required)>'
Finished in 0.20199 seconds 1 example, 1 failure
Failed examples:
rspec ./mashup_controller_rspec.rb:7 # MashupController simulates query
Here is my code:
require 'spec_helper'
require 'mashup_controller.rb'
describe MashupController do
it "simulates query" do
post :create
end
end
Sorry if I'm not making any sense. I am very new to rails and rspec. Any help would be appreciated. Thanks.
回答1:
If the spec file is not under spec/controllers
, methods like get
and post
will not be automatically made available by rspec-rails
.
You either need to tag your spec:
describe MyController, type: :controller do
# ...
end
or include the module:
describe MyController do
include RSpec::Rails::ControllerExampleGroup
# ...
end
See the relevant code in rspec-rails.
回答2:
- Make sure you have
gem spec-rails
in your Gemfile - Your
mashup_controller_rspec.rb
should be underspec/controllers
回答3:
I used gem rspec-rails instead of gem spec-rails.
回答4:
In Rails 4, you can declare the type of the RSpec tests as :request
and the spec file can be in any directory.
example: in spec/routes/users.rb
RSpec.describe 'UserRoutes', type: :request do
...
end
回答5:
My solution is
describe MyController, type: :controller
...
end
来源:https://stackoverflow.com/questions/7135377/problem-with-rspec-test-undefined-method-post