2017-07-19 24 views
1

當我嘗試在本地執行golang中的單元測試時嘗試通過MockStub對象實例化和調用另一個鏈接代碼時,我一直在遇到編譯問題。下面是我的文件層次:Hyperledger Fabric單元測試跨鏈代碼調用時沒有摺疊供應商文件夾

├── transaction-chaincode 
│   ├── transaction.go 
│   ├── transaction_test.go 
│   └── vendor 
└── user-chaincode 
    ├── user.go 
    ├── user_test.go 
    └── vendor 

這裏的場景基本上涉及chaincode之一,例如user.go,調用其他chaincode transaction.go。兩個目錄中的供應商文件夾包含完全相同的內容。

當我嘗試通過user_test.go中的shim.NewMockStub實例化事務鏈代碼的新實例時,發生問題,因爲事務模擬對象從事務鏈代碼/供應商/而不是用戶定義的查找init方法, chaincode/vendor /,儘管供應商文件夾具有相同的包(因此也是相同的方法)。

我能夠通過在事務鏈代碼的父目錄中擁有單個供應商文件夾來擺脫此錯誤,但我不能爲了開發目的而這麼做。你會如何解決這個單元測試問題,同時將供應商文件夾保存在各自的位置?

+0

您使用什麼工具進行銷售?你在'vendor'目錄下的軟件包使用什麼導入路徑? – yazgazan

+0

@yazgazan使用什麼工具進行出售工作有什麼意義? 我正在使用govendor,並且導入路徑是供應商目錄內的包與原始包相同 –

+0

「常規」方法是供應商二進制文件,而不是庫。如果您的銷售工具變平了dep樹(沒有嵌套的供應商目錄),您仍然可以脫離庫中的銷售。您可以通過在'transaction-chaincode'中將'user-chaincode'進行銷售來解決您的問題,反之亦然,但這會使維護工作變得非常痛苦。我認爲最好的解決方案是在父目錄中進行銷售(假定父目錄是存儲庫的根目錄)。 – yazgazan

回答

0

如果我理解正確,那麼您在每個供應商文件夾中都放置了填充和其他依賴項。 user_test.go然後做一些像NewMockStub(...,& transaction_chaincode.transaction {})。你想transaction_chaincode.transaction綁定到用戶/供應商?

我不認爲會發生。 transaction_chaincode.transaction中的墊片導入將綁定到其transaction_chaincode/vendor。

如果以上的理解是正確的,你爲什麼認爲它是一個「問題」?

+0

是的,你的理解是正確的。 問題是我不能模擬鏈式代碼調用,因爲某些函數依賴於調用其他鏈式代碼。例如,我需要在user_chaincode_test中使用transaction_chaincode.transaction,但編譯器會發出抱怨,因爲user_chaincode_test無法在transaction_chaincode/vendor中查找綁定的填充程序導入;它只引用到user_chaincode/vendor的路徑,這對於啓動事務MockStub是不匹配的 –