Rspec 将视图参数传递给控制器规范
Rspec passing view params to controller spec
我的问题是我试图使用 rspec 尽可能多地覆盖我的方法,但我无法测试某些特定的行。我正在尝试将参数散列传递给 rspec 中的控制器方法,以模拟视图中的值。本质上,这些值将过滤要显示在我的索引页面上的结果。
我正在测试的控制器方法是:
def index
@buildings = Building.all
@buildings = @buildings.searchaddress(params[:searchaddress])
if params[:searchcompany] != nil
@buildings = @buildings.searchcompany(params[:searchcompany][:management])
end
if params[:searchcompany] != nil
@buildings = @buildings.searchcity(params[:searchcity][:city])
end
if params[:searchparking] == 'on'
params[:searchparking] = 't'
@buildings = @buildings.searchparking(params[:searchparking])
end
if params[:searchpets] != nil
params[:searchpets] = 't'
@buildings = @buildings.searchpets(params[:searchpets])
end
结束
我正试图在我的 rspec 测试中传递参数散列。我尝试了几种方法,包括这个:
describe "viewing all buildings" do
it "renders index template" do
param = Hash.new()
param[:searchcompany] = [management:'asdf']
param[:searchcity] = [city:'asdf'] #have also tried {city:""}
param[:searchparking] = ['on']
param[:searchpets] = [true]
param[:searchaddress] = ['lalala']
get :index, params:param #{searchcompany:{management:'asdf'}, searchcity:{city:'asdf'}, searchparking:'on', searchpets:true}
expect(response).to render_template('index')
expect(assigns(:buildings)).to be_truthy
expect(Building).to receive(Building.searchcompany)
expect(Building).to receive(Building.searchcity)
expect(Building).to receive(Building.searchpets)
expect(Building).to receive(Building.searchparking)
end
end
searchpets、searchcompany 等方法来自我的建筑模型并实现为
def self.searchaddress(search)
where("address LIKE ?", "%#{search}%")
end
这是我收到的错误:
1) BuildingsController viewing all buildings renders index template
Failure/Error:
def self.searchcity(search)
where("city LIKE ?", "%#{search}%")
ArgumentError:
wrong number of arguments (0 for 1)
# ./app/models/building.rb:39:in `searchcity'
# ./spec/controllers/buildings_controller_spec.rb:103:in `block (3 levels) in <top (required)>'
如何通过 rspec 测试将 [:searchcity][:city] 传递给我的控制器方法?
你可以试试:
it "renders index template" do
params = {
searchcompany: {
management: 'asdf'
},
searchcity: {
city: 'asdf'
},
searchparking: 'on'
}
# All your expectations like 'expect(sth).to receive(:method)' go here
get :index, params
# Your remaining expectations go here
end
我的问题是我试图使用 rspec 尽可能多地覆盖我的方法,但我无法测试某些特定的行。我正在尝试将参数散列传递给 rspec 中的控制器方法,以模拟视图中的值。本质上,这些值将过滤要显示在我的索引页面上的结果。
我正在测试的控制器方法是:
def index
@buildings = Building.all
@buildings = @buildings.searchaddress(params[:searchaddress])
if params[:searchcompany] != nil
@buildings = @buildings.searchcompany(params[:searchcompany][:management])
end
if params[:searchcompany] != nil
@buildings = @buildings.searchcity(params[:searchcity][:city])
end
if params[:searchparking] == 'on'
params[:searchparking] = 't'
@buildings = @buildings.searchparking(params[:searchparking])
end
if params[:searchpets] != nil
params[:searchpets] = 't'
@buildings = @buildings.searchpets(params[:searchpets])
end
结束
我正试图在我的 rspec 测试中传递参数散列。我尝试了几种方法,包括这个:
describe "viewing all buildings" do
it "renders index template" do
param = Hash.new()
param[:searchcompany] = [management:'asdf']
param[:searchcity] = [city:'asdf'] #have also tried {city:""}
param[:searchparking] = ['on']
param[:searchpets] = [true]
param[:searchaddress] = ['lalala']
get :index, params:param #{searchcompany:{management:'asdf'}, searchcity:{city:'asdf'}, searchparking:'on', searchpets:true}
expect(response).to render_template('index')
expect(assigns(:buildings)).to be_truthy
expect(Building).to receive(Building.searchcompany)
expect(Building).to receive(Building.searchcity)
expect(Building).to receive(Building.searchpets)
expect(Building).to receive(Building.searchparking)
end
end
searchpets、searchcompany 等方法来自我的建筑模型并实现为
def self.searchaddress(search)
where("address LIKE ?", "%#{search}%")
end
这是我收到的错误:
1) BuildingsController viewing all buildings renders index template
Failure/Error:
def self.searchcity(search)
where("city LIKE ?", "%#{search}%")
ArgumentError:
wrong number of arguments (0 for 1)
# ./app/models/building.rb:39:in `searchcity'
# ./spec/controllers/buildings_controller_spec.rb:103:in `block (3 levels) in <top (required)>'
如何通过 rspec 测试将 [:searchcity][:city] 传递给我的控制器方法?
你可以试试:
it "renders index template" do
params = {
searchcompany: {
management: 'asdf'
},
searchcity: {
city: 'asdf'
},
searchparking: 'on'
}
# All your expectations like 'expect(sth).to receive(:method)' go here
get :index, params
# Your remaining expectations go here
end