我是Rspec的新手,我正在尝试测试我的控制器方法以获得基本功能。我知道我不应该测试基本功能,但我更多的是为了学习而不是为了构建一些东西。
我有一个名为ProtocolsController的控制器。控制器用于基本CRUD功能。我正在尝试测试控制器#create方法。下面是我的#create控制器:
def create
@protocol = Protocol.new(protocol_params)
if @protocol.save
flash[:notice] = 'New protocol added'
redirect_back(fallback_location: 'test_results#index')
else
flash[:notice] = @protocol.errors[:name]
render 'new'
end
end
为了测试悲伤路径,我想向控制器传递一个模拟对象,该对象包含用于创建Protocol类实例的必要参数。为此,我有以下代码:
describe '#create' do
it 'fails to save because the name already exists' do
params = FactoryGirl.attributes_for(:protocol)
post :create, :protocol => params
end
end
现在我知道测试不完整,但我一次测试一行,当我运行Rspec时,我收到以下错误:
Failure/Error: post :create, :protocol => params
ArgumentError:
unknown keyword: protocol
但是当我将帖子更改为:expect { post :create, :protocol => params }
有效。这让我想到了我的问题:
post :create, :protocol => params
)失败?对这些问题的任何见解将不胜感激。我一直在试图解决这个问题,我的猜测是,这是一个明显的答案。
答案 0 :(得分:9)
你在调用post
的方式在Rails 5中不再有效。
这是以前版本的弃用警告:
ActionController :: TestCase HTTP请求方法在将来的Rails版本中只接受关键字参数。
现在你必须添加params
密钥,如下所示:
post :create, params: { protocol: params }
请注意,post :create, :params => { :protocol => params }
表示相同,它只是一种不同的语法。