2017-07-19 7 views
1

MokStubオブジェクトから別のチェインコードをインスタンス化して呼び出す際に、golangでユニットテストをローカルで実行しようとしたときにコンパイルの問題が発生しました。以下は私のファイル階層です:Hyperledgerファブリックユニットのベンダーフォルダを折りたたむことなくクロスチェインコードを呼び出す

ここでのシナリオは基本的に、チェーンコードの1つ、たとえばuser.goを含み、他のチェーンコードtransaction.goを呼び出します。両方のディレクトリのベンダフォルダには、まったく同じ内容が含まれています。

問題は、トランザクション・モック・オブジェクトがトランザクションチェーンコード/ベンダー/内のinitメソッドをユーザー定義ルーチンの代わりに探すため、user_test.goのshim.NewMockStubを介してトランザクション・チェーンコードの新しいインスタンスをインスタンス化しようとすると発生します。チェーンコード/ベンダー/、同じパッケージを持つベンダーのフォルダ(と同じ方法)にもかかわらず。

トランザクションチェーンコード&のユーザーチェーンコードの親ディレクトリに単一のベンダーフォルダを持つことで、このエラーを取り除くことができましたが、開発目的ではできません。ベンダーのフォルダをそれぞれの場所に置いて、この単体テストの問題を解決する方法を教えてください。

+0

どのようなツールを商品化に使用していますか? 'vendor'ディレクトリのパッケージにはどのようなインポートパスを使いますか? – yazgazan

+0

@ yazgazanどのようなツールが商品化に使用されているかは重要ですか? 私はgovendorを使用しています。インポートパスは、ベンダのディレクトリ内のパッケージは元のパッケージと同じです –

+0

"従来の"アプローチはライブラリではなく、ベンダのバイナリです。あなたのベンダーツールがデプロイツリーを平らにしている場合(ネストされたベンダーディレクトリを持たない場合)、ライブラリ内のベンダーリングを取り除くことができます。おそらく 'transaction-chaincode'に' user-chaincode'を展開することで問題を解決することができますが、これはベンダーに苦痛を与えないようにします。私が考えるベストな解決策は、あなたの親ディレクトリ(親ディレクトリがあなたのリポジトリのルートであると仮定して)でベンダリングを行うことです。 – yazgazan

答えて

0

私が正しく理解していれば、各ベンダーのフォルダにshimやその他の依存関係を置いています。 user_test.goはNewMockStub(...、& transaction_chaincode.transaction {})のようなコードを実行します。 transaction_chaincode.transactionをuser/vendorにバインドしますか?

私はそれが起こるとは思わない。 transaction_chaincode.transactionのshimインポートは、そのtransaction_chaincode/vendorにバインドされます。

上記の理解が正しい場合、なぜそれが「問題」と思われますか?

+0

はい、あなたの理解は正しいです。 問題は、特定の機能が他のチェーンコードを呼び出すことに依存するため、チェーン間コード呼び出しをモックできないことです。たとえば、user_chaincode_testでtransaction_chaincode.transactionを使用する必要がありますが、user_chaincode_testはtransaction_chaincode/vendorのバインドされたshimインポートを探す方法がないため、コンパイラは不平を言います。 user_chaincode/vendorへのパスのみを参照します。これは、トランザクションMockStubの開始の不一致です –

関連する問題