2016-07-28 5 views
2

現在、リクエスト仕様が失敗した(タイプミスまたはその他の例外)場合、実際には影響を受けない他のリクエスト仕様に影響します。リクエスト仕様に依存するエラー(ログイン時にユーザデバイスのアップデートに間違ったSQLを作成しました)

私たちは、ユーザがログインする必要があり、要求スペックを持っている:問題は、私は

(、成功せずhttps://github.com/tak1n/reproduction)を詳細に問題を最小限に抑えた再生アプリを作成しようとしましたので、私たちは多くの宝石を使用しています。ユーザー認証ではdeviseを使用するため、Warden :: Test :: Helpersを使用して要求仕様のユーザーにログインします。ユーザーがログインすると、Deviseはユーザー関連の属性を自動的に更新します(last_sign_in_at、last_sign_in_ipなど)。

ここで問題となるのは、この変更を行うためにユーザーを保存しようとすると、最終結果がUPDATEユーザーではなくINSERT INTOユーザーであるため、クラッシュします。ここで

は、我々のアプリから例のスペックです:

require 'rails_helper' 

RSpec.describe 'Suggestions API' do 
    let(:user) { FactoryGirl.create(:user, :professional) } 

    before do 
    login(user) # same as in https://github.com/tak1n/reproduction/blob/master/spec/support/request_macros.rb#L6 
    end 

    describe '/suggestions.json', :vcr do 
    context 'with non saved filter' do 
     # some setup stuff here (setup proper objects in db) 

     # also params are defined here through let(:params) { ... } 

     it 'returns proper suggestions' do 
     Suggestion.refresh! 

     get '/suggestions.json', paramst 

     expect(json.count).to eq(2) 

     expect(json.first['id']).to eq(sug2.id) 
     expect(json.second['id']).to eq(sug1.id) 
     end 
    end 

    context 'with saved filter' do 
     # some setup stuff here (setup proper objects in db) 

     # also params are defined here through let(:params) { ... } 

     it 'returns proper suggestions' do 
     Suggestion.refresh! 

     get '/suggestions.json', params 

     expect(json.count).to eq(2) 

     expect(json.first['id']).to eq(sug2.id) 
     expect(json.second['id']).to eq(sug1.id) 
     end 
    end 
    end 
end 

この結果は、最初の仕様が原因でそれがないタイプミスparamst、と失敗しますが、それは、第2の仕様に影響を与えることをする必要があります:

ここで

が仕様の実行です:https://gist.github.com/tak1n/102c1aa121b66e0ab56602b76f911ec0

私は深く掘るしようとしたロジックがどうか保存することを見たレコードがhttps://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L85

0123に依存している作成または更新します

次の場合、@new_recordの内容を出力しようとしました。

def new_record? 
    sync_with_transaction_state 
    puts "New record: #{@new_record}" if self.class == User 
    @new_record 
end 

私は次しまっ:https://gist.github.com/tak1n/6eb24693226d8e6a713c0865ea1bebd5

ここでの違いは、ためのものです:https://gist.github.com/tak1n/330560a3a108abc8fce4d105a48ac444

仕様が異なる順序で実行する場合(非最初に失敗し、それにタイプミスかの例外を除いてSPEC)私はこれを得ました「作業中」仕様のNew Record: <boolean>が異なっています。例外を含むスペックがその前に実行されると、新しいレコードが突然trueになるため、SQLを生成して新しいレコードを作成します。

次へ私はこの問題を引き起こしている宝石をいくつか想定していましたが、おそらく私はそれがdatabase_cleanerだと思っていましたが、再現では多かれ少なかれ同じ働きをします。

問題は私が実際にどこに進んでいるのかわからないデバッグに固執しています。また、どの宝石やコード自体がこれを引き起こしているのかよく分かりません。

ご不明な点がございましたら、お気軽にお問い合わせください。

+0

あなたの 'it'ブロック内に' login(user) '呼び出しを置こうとしましたか?私はこれが確実に実行され、例外が発生したブロックの下側でもユーザーを作成すると考えている。 – DiegoSalazar

+0

@diego。greyrobotええ私はユーザーの作成とログインを 'it'ブロックに入れようとしましたが、' before do'と同じ結果は 'before(:each)do'と基本的に同じです。仕様例。 –

答えて

関連する問題