2017-08-28 21 views
0

APIs on Railsの本を守っています。私は第8章にあります.RSpec 3.6でテストしている間、私は以前には得られなかったエラーを受けています。私はgit checkoutがこれらのテストが合格したコミットになってもそれらを取得しています。私は、Rails 5.1.3でこの本を読むことについて、私がブログ記事を書いているので、彼らがそうだったと確信しています。私は、第8章の終わりにテストスイート全体を実行することで、彼らが通過していないことを発見しました(失敗する仕様は第7章と第6章から来ています)。私は特定のファイルのためにほとんどの仕様を実行する前に。コミット後にもRSpecテストに失敗しました(

だから私はこの問題はシステム依存することができると思ったが、私はアプリの外の端末でやっていた唯一のものだった:

$ swapoff -a 
$ swapon -a 

、多分sudo apt-get update

だから私はバインドでいます今。

ERROR:

このエラーの場合のテストは#index作用

products_controller_spec.rbにGET要求の後6を取得している間FactoryGirl製品の4つのインスタンスを作成することである。

require 'rails_helper' 

RSpec.describe Api::V1::ProductsController, type: :controller do 
    ... 

    describe "GET #index" do 
    before(:each) do 
     4.times { FactoryGirl.create :product } 
    end 

    context "when is not receiving any product_ids parameter" do 
     before(:each) do 
     get :index 
     end 

     it "returns 4 records from the database" do 
     products_response = json_response[:products] 
     expect(products_response).to have(4).items 
     end 

     ... 
    end 
    ... 
    end 
... 
end 

エラーメッセージ:

Api::V1::ProductsController GET #index when is not receiving any product_ids parameter returns 4 records from the database 
    Failure/Error: expect(products_response).to have(4).items 
     expected 4 items, got 6 

I puts products_responseがテストを失敗する前に、私はこれらの6つのレコードでJSONを得た場合:

[ 
    { 
    "id": 1, 
    "title": "Audible Remote Amplifier", 
    "price": "100.0", 
    "published": false, 
    "user": { 
     "id": 1, 
     "email": "[email protected]", 
     "created_at": "2017-08-27T12:13:26.977Z", 
     "updated_at": "2017-08-27T12:13:26.977Z", 
     "auth_token": "KA1ugPyXzXsULh6rN6QX", 
     "product_ids": [ 
     1 
     ] 
    } 
    }, 
    { 
    "id": 2, 
    # rest of attributes 
    }, 
    { 
    "id": 3, 
    # rest of attributes 
    }, 
    { 
    "id": 4, 
    # rest of attributes 
    } 
    }, 
    { 
    "id": 5, 
    # rest of attributes 
    }, 
    { 
    "id": 6, 
    # rest of attributes 
    } 
] 

TESTING MANUALLY:

私のアプリは仕事の罰金です。 api.mydomain.dev/productsを打っている間、私はrails consoleに3つの製品を作成した後に素敵なJSONレスポンスを得た:(ところでここに含まれていない失敗スペックの残りの2つです)api.mydomain.dev/products?min_price=15&max_price=30のようなURLでのparamsと

{ 
    "products": [ 
    { 
     "id": 1, 
     "title": "product", 
     "price": "3.3", 
     "published": false, 
     "user": { 
     "id": 1, 
     "email": "[email protected]", 
     "created_at": "2017-08-13T07:31:29.339Z", 
     "updated_at": "2017-08-27T13:09:06.948Z", 
     "auth_token": "HJLb-d4DpgxQDzkR1RDf", 
     "product_ids": [ 
      1, 
      2 
     ] 
     } 
    }, 
    { 
     "id": 2, 
     # attrs of second product in json 
    }, 
    { 
     "id": 3, 
     # attrs of third product in json 
    } 
    ] 
} 

とも:

私はspec/models/product_spec.rbに4つのエラーがありますが、この質問を短く保つためにここには含めません。理由は同じで、このエラーは最も簡潔だと思います。

私はもっとコードを提供するかもしれませんが、githubリポジトリに公開しています。 app/models/product.rb又はapp/api/v1/products_controller.rb

要約:

をアプリが正常に動作して、手動でテスト中に予想される出力を提供することです。これらのテストが合格した場所にコミットした後でも、自動的にテストしている間にエラーが発生しました。これは問題がシステム側にあることを示唆している可能性があります。それがシステム側にない場合は、前に4つになっている間に余分な2つのオブジェクトを取得する理由は何ですか?問題はどこだ?

答えて

1

あなたのテストDBがクリーニングされていない可能性があります。 rails c testとクエリProduct.countを実行して、テストDBにこのエラーの原因となっている製品レコードがあるかどうかを確認してください。ファクトリを使用してテストを実行する前に、レコードを作成して既存のレコードが存在しないことを確認する前に、byebugまたはputs Product.countを前の(:each)ブロックに配置することもできます。この場合、手動またはDatabaseCleaner Gemを使用して、テストの前後にDBをクリーニングする必要があります。

ヒント: 作成する予定のレコードの数に変数を使用することをお勧めします。 例:

products_count = 4.times { FactoryGirl.create :product } 
expect(products_response).to have(products_count).items 
+0

はい、そうです。それを素早くチェックするために、私はあなたが言ったように 'rails c test'に行きました、そして、これらの2つのレコードはそこにありました(方法は分かりません)。私は 'Product.destroy_all'によってそれらを破壊し、5つのテストはすべて再び成功しています。私はDatabaseCleanerのドキュメントを掘り起こす必要があるようです。ありがとうございました。 – ToTenMilan

+0

うれしい私は助けることができます。乾杯。 –

関連する問題