gpt4 book ai didi

ruby-on-rails - Rails API rspec 测试

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:42 25 4
gpt4 key购买 nike

我正在构建一个 API,用户 可以在其中关注并被其他用户 关注。我创建了一个 Relationship 表来处理关联以及 Relationship 端点。这是我关注某人的终点:

def create
user = User.find(params[:followed_id])
if user
current_user.follow(user)
render json: [current_user, Relationship.where(followed_id: user.id, follower_id: current_user.id)], status: 201, location: [:api, current_user]
else
render json: { errors: current_user.errors }, status: 422
end
end

一切都按预期工作。如您所见,我想用我的 current_user 对象和新创建的 Relationship 对象进行响应。当我点击提供授权 token 和我想关注的用户 ID 的端点时,这两者都有效。我遇到的问题是测试我是否取回了一个 Relationship 对象。以下是我对以下端点的测试:

describe "POST #create" do

context "When relationship is successfully created" do
before(:each) do
@user = FactoryGirl.create(:user)
other_user = FactoryGirl.create(:user)
api_authorization_header(@user.auth_token)
post :create, followed_id: other_user.id
end

it "should respond w/ current_user object" do
user_response = JSON.parse(response.body, symbolize_names: true)
expect(user_response[0][:id]).to eq(@user.id)
end

### THIS TEST IS FAILING & THE ONE THAT I NEED HELP WITH.
it "should respond w/ created relationship object" do
user_response = JSON.parse(response.body, symbolize_names: true)
expect(user_response[1]).to be_kind_of(Relationship)
end

it { should respond_with(201) }
end

end

以下是 user_response 的一些输出:

user_response = {:id=>1233, :email=>"desmond.pollich@stanton.co", :first_name=>"Marcelina", :last_name=>"Morissette", :created_at=>"2016-03-28T18:16:09.875Z", :updated_at=>"2016-03-28T18:16:09.875Z", :auth_token=>"Ky25sYoJc4gH-p122yEH"}
{:id=>150, :follower_id=>1233, :followed_id=>1234, :created_at=>"2016-03-28T18:16:09.892Z", :updated_at=>"2016-03-28T18:16:09.892Z"}

您可以看到 user_response 正在返回我要求它响应的两个对象的数组。

user_response[1] = {:id=>150, :follower_id=>1233, :followed_id=>1234, :created_at=>"2016-03-28T18:16:09.892Z", :updated_at=>"2016-03-28T18:16:09.892Z"}

这是我在尝试运行 `expect(user_response[1]).to be_kind_of(Relationship) 时收到的错误

1) Api::V1::RelationshipController POST #create When relationship is successfully created should respond w/ created relationship object
Failure/Error: expect(user_response[1]).to be_kind_of(Relationship)
expected [{:id=>153, :follower_id=>1239, :followed_id=>1240, :created_at=>"2016-03-28T18:18:43.064Z", :updated_at=>"2016-03-28T18:18:43.064Z"}] to be a kind of Relationship(id: integer, follower_id: integer, followed_id: integer, created_at: datetime, updated_at: datetime)
# ./spec/controllers/api/v1/relationship_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

关于如何测试被发回的第二个对象是来自 Relationship 类的对象的任何建议?此外,如果有更“正确”的方式来处理此端点,我将不胜感激类(class) =)。

最佳答案

“create”方法返回一个 JSON 响应,而不是一个 ActiveRecord 对象。 HTTP 响应不能是“be_kind_of(Relationship)”。 JSON 只是格式化的文本。

如果您要构建 RESTful API,则必须测试请求中的 JSON 响应和 HTTP 状态,而不是测试 Controller 。像这样的东西:

it 'updates a user on update_user action' do
params = {
id: @user.id, # FactoryGirl object
fname: 'John',
lname: 'Smith',
email: 'newemail@ert.com'
}

post '/v1/users/update', params, @env

# test for the 200 status-code
expect(response).to be_success
expect(json['data']['email']).to eq 'newemail@ert.com'
end

顺便说一句,您不应该在 API 中使用 session 。而是在您的请求中将您的用户 ID 作为参数发送。

http://matthewlehner.net/rails-api-testing-guidelines/

关于ruby-on-rails - Rails API rspec 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36268486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com