我正在尝试为InvitationsController#Create
编写测试。
这是POST
http动作。
基本上应该发生的是,一旦post#create
首次执行,我们需要做的第一件事就是检查系统中是否存在User
以传入的电子邮件通过params[:email]
请求上的Post
。
我很难绕过我的工作方式。
我稍后会重构,但首先我想让测试功能正常工作。
这就是我所拥有的:
describe 'POST #create' do
context 'when invited user IS an existing user' do
before :each do
@users = [
attributes_for(:user),
attributes_for(:user),
attributes_for(:user)
]
end
it 'correctly finds User record of invited user' do
expect {
post :create, invitation: attributes_for(:member, email: @users.first.email)
}.to include(@users.first[:email])
end
end
end
这是我得到的错误:
1) Users::InvitationsController POST #create when invited user IS an existing user correctly finds User record of invited user
Failure/Error: expect {
You must pass an argument rather than a block to use the provided matcher (include "valentin@parisian.org"), or the matcher must implement `supports_block_expectations?`.
# ./spec/controllers/users/invitations_controller_spec.rb:17:in `block (4 levels) in <top (required)>'
我对这个错误并不感到惊讶,因为测试对我来说感觉不对。如果不在我的controller#action
中编写代码,我就无法弄清楚如何测试。
我正在使用FactoryGirl,它可以完美地工作,因为它返回所有数据类型的有效数据。这里的问题是如何让RSpec实际测试我需要的功能。
答案 0 :(得分:2)
您遇到的错误是语法错误,与您的操作无关。
你在那里的代码被解释为你将一个块({}
)传递给expect方法。
我将其更改为
it 'correctly finds User record of invited user' do
post :create, { email: @users.first[:email] }
expect(response).to include(@users.first[:email])
end
假设创建操作的响应将电子邮件作为纯文本返回,这对我来说似乎很奇怪。
另请注意,我已email
直接传递到帖子,因为您提到您在params[:email]
中期待它,但您编写的测试似乎是您在params[:invitation][:email]
中期待的。
如果是这种情况,请更改该部分。