我正在关注Michael Hartl的Ruby on Rails Tutorial。
我到了Chapter 11.37,但我的测试失败了。我收到以下错误:
Failure/Error: xhr :post, :create, relationship: { followed_id: other_user.id }
ArgumentError:
bad argument (expected URI object or URI string)
我是Ruby on Rails的新手,所以我真的不知道出了什么问题。有人可以帮助解决此错误吗?
控制器/ relationships_controller.rb:
class RelationshipsController < ApplicationController
before_action :signed_in_user
def create
@user = User.find(params[:relationship][:followed_id])
current_user.follow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
def destroy
@user = Relationship.find(params[:id]).followed
current_user.unfollow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
end
特征/ relationships_controller_spec.rb:
require 'spec_helper'
describe RelationshipsController, type: :request do
let(:user) { FactoryGirl.create(:user) }
let(:other_user) { FactoryGirl.create(:user) }
before { sign_in user, no_capybara: true }
describe "creating a relationship with Ajax" do
it "should increment the Relationship count" do
expect do
xhr :post, :create, relationship: { followed_id: other_user.id }
end.to change(Relationship, :count).by(1)
end
it "should respond with success" do
xhr :post, :create, relationship: { followed_id: other_user.id }
expect(response).to be_success
end
end
describe "destroying a relationship with Ajax" do
before { user.follow!(other_user) }
let(:relationship) { user.relationships.find_by(followed_id: other_user) }
it "should decrement the Relationship count" do
expect do
xhr :delete, :destroy, id: relationship.id
end.to change(Relationship, :count).by(-1)
end
it "should respond with success" do
xhr :delete, :destroy, id: relationship.id
expect(response).to be_success
end
end
end
答案 0 :(得分:9)
xhr
The version,其方法作为第二个参数,来自ActionController::TestCase::Behavior
。该模块仅包含在rspec-rails gem的 controller 或 view 测试中。你正在从Rails中获取another version of xhr
,并期望一个路径作为第二个参数,因此你得到了错误。
您需要确保测试的类型为controller
,方法是将其包含在controllers
目录中或明确设置测试类型。由于您在 features 目录中进行了测试而未进行其他类型的测试,因此不会将其视为控制器测试。 (注意:教程中的图11.37确实将测试驻留在spec/controllers
目录中。)
答案 1 :(得分:3)
xhr方法seems to receive a path而不是动作名称。因此,如果用
替换它应该有效xhr :post, relationships_path, relationship: { followed_id: other_user.id }