2

Go 内でのテストの理由でファクトリ関数を再割り当てして、その型の 1 つをモックしたいときに、特定のパッケージ内でファクトリ関数を使用するリスクを軽減することに興味があります。

ファクトリ関数を関数の引数として渡し、ファクトリをデータ メンバーとして保持する構造体を作成する人を見てきました。代わりに、トップレベルの関数変数を保持し、特定のファイル内である実装を別の実装で上書きすることは可能ですか? 私は以下を試しました:

type AirportFactory func (string, int, int) Airport

var makeAirport AirportFactory = func(n string, x int, y int) Airport {
    return airport{name: n, pos: Position{X: x, Y: y}}
}

makeAirport = func(n string, x int, y int) Airport {
    return airport{name:"default", pos:Position{X:0, Y:0}}
}

しかし、コードをビルドすると、最後の割り当ての最後の行で 6g から次のエラーが表示されます。 non-declaration statement outside function body

varこれにより、少なくとも最上位レベルでは、関数型の s が const のように見えます。これを回避する方法はありますか?

4

2 に答える 2

3

それらは一定ではありません。関数の外で既に宣言されている変数に代入することはできません。次のようなものが機能します。

func changeAirport() {
    makeAirport = func(n string, x int, y int) Airport {
        return airport{name:"default", pos:Position{X:0, Y:0}}
    }
}

goに関する限り、関数外の変数割り当ては特定の順序で発生しません。そのため、一度しか実行できません。

于 2012-06-18T04:56:55.043 に答える
2

package init関数を使用して、パッケージ変数のモック値を設定できます。例えば、

package main

import "fmt"

var x = 1

// set mock values of variables
func mock() {
    x = 2
}

func init() {
    mock()
}

func main() {
    fmt.Println(x)
}

出力:

2

あなたの例では、

package main

import "fmt"

type Position struct {
    X int
    Y int
}
type Airport struct {
    name string
    pos  Position
}

type AirportFactory func(string, int, int) Airport

var makeAirport AirportFactory = func(n string, x int, y int) Airport {
    return Airport{name: n, pos: Position{X: x, Y: y}}
}

// set mock values of variables
func mock() {
    makeAirport = func(n string, x int, y int) Airport {
        return Airport{name: "default", pos: Position{X: 0, Y: 0}}
    }
}

func init() {
    mock()
}

func main() {
    fmt.Println(makeAirport("name", 1, 1))
}

出力:

{default {0 0}}
于 2012-06-18T05:15:16.353 に答える