2016-03-28 22 views
2

私はUsersが続き、続いて他にUsersというAPIを構築しています。私はRelationshipエンドポイントと共にアソシエーションを処理するためにRelationshipテーブルを作成しました。誰かをフォローするエンドポイントは次のとおりです。Rails APIのrspecテスト

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オブジェクトで応答したいと思います。どちらも、このエンドポイントにヒットしたときに、承認トークンと私が従いたいユーザーの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=>"[email protected]", :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"} 

が期待する(USER_RESPONSE [1])。be_kind_ofするために `を実行しようとしたとき、私は受信誤りがある(関係)私は第2の目的はされていることをテストすることができますどのように

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クラスのオブジェクトですか?また、このエンドポイントを扱うための「正しい」方法があれば、私はレッスン=)に感謝します。

答えて

1

"create"メソッドがActiveRecordオブジェクトではなくJSON応答を返しています。 HTTP応答は "be_kind_of(Relationship)"にすることはできません。 JSONはフォーマットされたテキストです。

RESTful APIを構築する場合は、要求のJSON応答とHTTPステータスをテストし、コントローラをテストしないといけません。次のようなものがあります。

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

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

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

ところで、APIでセッションを使用しないでください。代わりに、ユーザーIDをリクエストのparamとして送信します。

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

+0

これは意味があります。私は 'follower_id'を' @ user' idに対してチェックするように変更しました。 – Nappstir

+0

あなたのAPIでセッションを使用していないことに関して。共有したリンクでも、APIデモでセッションが使用されます。私が成功したログインに 'auth_token'を返すのは私の仕事です。私が参照している他の例/チュートリアルはすべて、認証トークンを返す「ステートレス」セッションを通じてユーザーのログインを処理します。これを処理するより良い方法はありますか? – Nappstir

+0

JSONオブジェクトとして必要なすべてのデータをJSONオブジェクトとして送信したいのですが、この方法はドキュメントで明示的に設定しやすくなります。 https://api.yourcompany.com/v1/crateuser/{token_number:'3453xf343 '、token_secret:' ***** '、user_id:56、follower_id:36} 「https」プロトコルに注意してください。ユーザーはすべての呼び出しでtoekとtoken_secretを送信します。 – aarkerio

関連する問題