2017-11-28 5 views
0

私はPactのPython implementationを見て、プロバイダの状態を設定しようとしています。これを行う方法は、プロバイダを正しい状態にするために呼び出されるサービスにエンドポイントを組み込むことです。問題は、そのエンドポイントが実際にどのように見えているかに関するドキュメントを見つけることができないということです。入力とは何か、それは何を返すのですか?Pact:プロバイダの状態を設定する方法

私はデフォルトのruby implementationを調べようとしましたが、これはプロバイダを特定の状態にするための全く異なるメカニズムを暗示しているようです。これは、ベリファイアスクリプトによってrequire dを取得したRubyモジュールを使用しているようですが、HTTPリクエストはまったく必要ありません。

プロバイダの状態を設定する正しい方法は何ですか?追加のエンドポイントを設定する必要がある場合、そのエンドポイントがどのように見えるのかを知る必要があります。クラス/モジュールをベリファイアスクリプトにインポートする必要がある場合は、それがruby以外の言語でどのように実装されているかを知る必要があります。

答えて

1

the documentation in Pact-Pythonによると、これは実際にどのように達成されたのか少しオープンです。個人的には、通常、Pythonで動作しないノードプロバイダは、私のプロバイダテストの中にありますが、私は、未使用のポートにサーバを作成します。未使用のポートは、契約から州を受け取って設定することです正しく。テストを実行すると、この小さなサーバーは、コンシューマー、プロバイダー、および状態を含むJSONファイルで協調して攻撃を受けます。

例えば、ここではノードの例です:

var http = require('http'); 

beforeAll(function(){ 
    // PROVIDER STATE LISTENER 
    http.createServer(function (req, res) { 
     var body = []; 
     // Ignore this bit, this is just how node does server request/response 
     req.on('data', (chunk) => { 
      body.push(chunk); 
     }).on('end',() => { 
      // Get body, parse JSON. JSON includes 'consumer' string and 'states' array of string 
      var json = JSON.parse(Buffer.concat(body).toString()); 


      // THIS IS WHERE YOU NEED TO SETUP YOUR STATE 
      res.status = 200; 
      switch(json.state) { 
       case "When User does something": // this is the actual name of the state that's specified by your consumer, which is found in the contract 
        // Setup any data that relates to your state here, like adding rows to a DB, setting environment variables, etc 
        break; 
       // Add another states that are used in your provider tests 
       default: 
        res.status = 500; 
        res.statusMessage = "Missing state '" + json.state + "'"; 
      } 
      res.end(); // Send the response back 
     }); 
    }).listen(9001); 
}) 

// Run your tests 
it("Test Pact Interactions", function() { 
    return pact.verifyPacts({ 
     // options here 
     providerStatesSetupUrl: "http://localhost:9001" 
    }); 
}); 

私はそれが理にかなって願っています。ここで

+0

この文書を正しく読んでいる場合は、プロバイダーの状態は1つしかない可能性があります。それはプロバイダー国の目的を完全に排除するものではありませんか? 1つしかない場合は、常にテストデータを保持するか、ハードコードされたセットアップルーチンを使用することもできます。 – ewok

+0

また、プロバイダーの状態をどのように破棄しますか? – ewok

+0

インタラクションごとに1つの状態があります。データを事前に設定することはできますが、消費者側からどのテストを行う必要があるかを前提としていますが、将来複雑になると問題になる可能性があります。ティアダウンに関しては、私は通常、すべての変更を追跡するものにすべての変更をラップし、新しい設定が行われたときに、以前にあったものはすべてクリアします。ルビーバージョンにはティアダウンがありますが、Pythonのようには見えません。 –

0

はプロバイダアメリカ

とプロバイダの状態のドキュメントhttps://github.com/pact-foundation/pact-provider-verifier/#api-with-provider-states

APIは、プロバイダの状態への導入のためdocs.pact.io上のプロバイダの状態セクションを読んでいます。

各インタラクションが再生される前に正しいデータを設定できるようにするには、外観のJSONドキュメントを受け入れるHTTPエンドポイント(実際にはプロバイダと同じアプリケーション内にあるかどうか)を作成する必要があります以下のようになります。

{ 
    "consumer": "CONSUMER_NAME", 
    "state": "PROVIDER_STATE" 
} 

エンドポイントは、指定されたコンシューマのプロバイダ状態を同期して設定し、プロバイダ状態が認識されない場合はエラーを返します。複数のコンシューマが同じプロバイダ状態を異なるデータで定義している場合、各コンシューマ内でプロバイダ状態を名前空間にすることで、衝突を回避できます。 - アクティブな消費者とプロバイダの状態を設定し、エンドポイントの完全なURL

--provider-states-setup-url:CLIを実行するとき

次のフラグが必要です。

各インタラクションの後に作成された特定のテストデータを破棄するのではなく、各セットアップコールの開始時にすべての既存データを消去する必要があります。これは、テストデータがあるテストから別のテストに漏れないようにする信頼性の高い方法です。


HTTPエンドポイントは実際にアプリケーション内にある必要はありません。アプリと同じデータストアにアクセスするだけで済みます。したがって、テストスイートで「テスト専用」のエンドポイントを追加できない場合は、アプリのデータストアに資格情報を共有する別のアプリを作成することを検討してください。

関連する問題