1

golang パッケージからメソッドをモックする解決策を見つけることができませんでした。

たとえば、私のプロジェクトには、Os.Getwd() がエラーを返したときに回復を試みるコードがあります。このための単体テストを作成する最も簡単な方法は、Os.Getwd() メソッドをモックしてエラーを返し、コードが適切に機能することを確認することです。

testify を使用してみましたが、できないようです。

誰でも経験がありますか?

4

4 に答える 4

3

私自身の解決策は、メソッドを引数として取ることでした。これにより、テスト時に代わりに「モック」を挿入できます。さらに、エクスポートされたメソッドをパブリック ファサードとして作成し、エクスポートされていないメソッドをテスト用に作成します。

例:

    func Foo() int {        
            return foo(os.Getpid)
    }                       

    func foo(getpid func() int) int {
            return getpid()      
    } 
于 2016-03-07T17:37:21.627 に答える
0

これは少し遅いことはわかっていますが、これを行う方法を次に示します。

通常、DAL または SystemCalls またはパッケージ呼び出しのテストは困難です。この問題を解決するための私のアプローチは、システム関数呼び出しをインターフェイスの背後にプッシュし、それらのインターフェイスの関数をモックすることです。例えば。

type SystemCalls interface {
 Getwd() error
}


type SystemCallsImplementation struct{
}
func (SystemCallsImplementation) Getwd() error{
 return  Os.Getwd() 
}

func MyFunc(sysCall SystemCalls) error{

sysCall.Getwd()
}

これにより、関数へのシステム コールを持つインターフェイスを挿入します。これで、テスト用のインターフェイスのモック実装を簡単に作成できます。

お気に入り

type MockSystemCallsImplementation struct{
err error
}
func (MockSystemCallsImplementation) Getwd() error{
return err  //this can be set to nil or some value in your test function
}

これがあなたの質問に答えることを願っています。

于 2016-11-10T09:11:47.753 に答える
0

os.Getwd テストを見ると、コードをテストする方法の例が得られるようです。TestChdirAndGetwd関数と を探しTestProgWideChdirます。

それらを読むと、テストによって一時フォルダーが作成されるようです。

したがって、実用的なアプローチは、上記のテストのように一時フォルダーを作成し、それらを壊してos.Getwd、テストでキャッチするエラーをスローすることです。

システムを台無しにする可能性があるため、これらの操作には注意してください。軽量コンテナまたは仮想マシンでテストすることをお勧めします。

于 2016-03-07T23:53:01.900 に答える