Rspec post:创建'未知关键字:'

Dar*_*isa 4 unit-testing rspec ruby-on-rails rspec-rails rspec3

我是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
Run Code Online (Sandbox Code Playgroud)

为了测试悲伤路径,我想向控制器传递一个模拟对象,该对象包含用于创建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 
Run Code Online (Sandbox Code Playgroud)

现在我知道测试是不完整的,但我一次测试一行,当我运行Rspec时,我收到以下错误:

Failure/Error: post :create, :protocol => params

     ArgumentError:
       unknown keyword: protocol
Run Code Online (Sandbox Code Playgroud)

但是当我将帖子更改为: expect { post :create, :protocol => params }

有用.这让我想到了我的问题:

  • 为什么第一个帖子(post :create, :protocol => params)失败了?
  • 我如何将模拟对象发送到控制器?
  • 为什么期望版本有效?

任何对问题的见解都将非常感激.我一直在试图解决这个问题,我的猜测是,这是一个明显的答案.

And*_*ata 11

你打电话的方式post在Rails 5中不再起作用了.

这是以前版本的弃用警告:

ActionController :: TestCase HTTP请求方法在将来的Rails版本中只接受关键字参数.

现在你必须添加params密钥,如下所示:

post :create, params: { protocol: params }

请注意,这post :create, :params => { :protocol => params }意味着相同,它只是一个不同的语法.