【问题标题】:Rspec post :create 'unknown keyword: 'Rspec post :create '未知关键字:'
【发布时间】:2017-10-10 21:40:12
【问题描述】:

我是 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

为了测试悲伤的路径,我想向控制器传递一个模拟对象,其中包含创建协议类实例所需的参数。为此,我有以下代码:

  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) 失败了?
  • 如何向控制器发送模拟对象?
  • 为什么期望版本有效?

对这些问题的任何见解将不胜感激。我一直在挠头试图弄清楚这一点,我的猜测是这是一个显而易见的答案。

【问题讨论】:

  • 您使用的是什么版本的 RSpec?
  • 最新版本-> 3.6

标签: ruby-on-rails unit-testing rspec rspec-rails rspec3


【解决方案1】:

您调用 post 的方式在 Rails 5 中不再适用。

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

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

现在您必须添加params 键,如下所示:

post :create, params: { protocol: params }

请注意post :create, :params => { :protocol => params } 的含义相同,只是语法不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多