2017-04-01 2 views
0

を取得する必要があり、私の要求仕様sites.spec.rbに私は、このテストがあります。RailsのAPIポストは合格のparamsが、開始するには、空の

describe "POST /v1/sites" do 

    let(:valid_attributes) { { url: "www.example.com", site_code: "123456" } } 

    context 'when the request is valid' do 
     before { post v1_sites_path, params: valid_attributes } 

     it 'creates a site' do 
     expect(json['url']).to eq("www.example.com") 
     expect(json['site_code']).to eq("123456") 
     end 

     it 'returns status code 201' do 
     expect(response).to have_http_status(201) 
     end 
    end 

を私は、「サイトを作成する」ための失敗のテストを取得します...

1) Sites POST /v1/sites when the request is valid creates a site 
    Failure/Error: expect(json['url']).to eq("www.example.com") 

     expected: "www.example.com" 
      got: ["can't be blank"] 

     (compared using ==) 
    # ./spec/requests/sites_spec.rb:61:in `block (4 levels) in <top (required)>' 
    # ./spec/rails_helper.rb:84:in `block (3 levels) in <top (required)>' 
    # ./spec/rails_helper.rb:83:in `block (2 levels) in <top (required)>' 

これは、私のサイトモデルの有効性が確認されているため、技術的に意味があります:url、:site_code、presence:true。投稿が正しくパラメータを渡していないため、テストに失敗しています。

module Api::V1 
    class SitesController < BaseApiController 
    before_action :set_site, only: [:show, :update, :destroy] 

    # GET /sites 
    def index 
     @sites = Site.all 

     render json: @sites 
    end 

    # GET /sites/1 
    def show 
     render json: @site 
    end 

    # POST /sites 
    def create 
     @site = Site.new(site_params) 

     if @site.save 
     render json: @site, status: :created, location: @site 
     else 
     render json: @site.errors, status: :unprocessable_entity 
     end 
    end 

    # PATCH/PUT /sites/1 
    def update 
     if @site.update(site_params) 
     render json: @site 
     else 
     render json: @site.errors, status: :unprocessable_entity 
     end 
    end 

    # DELETE /sites/1 
    def destroy 
     @site.destroy 
    end 

    private 
     # Use callbacks to share common setup or constraints between actions. 
     def set_site 
     @site = Site.find(params[:id]) 
     end 

     # Only allow a trusted parameter "white list" through. 
     def site_params 
     # params.require(:data).require(:attributes).permit(:url, :side_code, :user_id) 
     # params.require(:site).permit(:url, :side_code, :user_id) 
     params.fetch(:site, {}).permit(:url, :side_code) 
     end 
    end 
end 

私はRailsのAPIのためのポストにパラメータを渡す午前方法は、おそらく他の完全にフォーマットされたか、正しくか何かされていないことを推測しています:

最後には、ここでのコントローラです。私は、データを試しているテストブロックのparamsで遊んだ:{attributes:valid_attributes}は運がない。

ご意見やご提案は大変ありがとうございます。

答えて

0

この問題は、実際にテストブロックでPOSTリクエストに渡していたパラメータの形式によるものです。私はコマンドラインを使ってPOSTをテストし、レールサーバーがどのようにパラメータが通ってきているかを見ました。彼らはこのように見えた:

Parameters: {"site_code"=>"123456", "url"=>"www.updated.com", "subdomain"=>"api", "id"=>"2", "site"=>{"site_code"=>"123456", "url"=>"www.updated.com"}} 

はその後、私のsites_spec.rbに、私はポスト要求の有効なのparamsのために、このフォーマットをコピー:

let(:valid_attributes) { { "site"=>{"url"=>"www.example.com", "user_id"=>user_id, "site_code"=>"123456"} } } 

これは動作します。 JSON形式のparamsは、実際のJSONリクエストの場合と同じ方法で、テストブロックでフォーマットする必要がありました。

関連する問題