Heim  >  Artikel  >  Backend-Entwicklung  >  Wenn Sie beim Durchlaufen der Teststruktur die Funktion „errors.As()“ verwenden, geben Sie den zweiten Parameter an „errors.As“ zurück, der nicht *error sein sollte

Wenn Sie beim Durchlaufen der Teststruktur die Funktion „errors.As()“ verwenden, geben Sie den zweiten Parameter an „errors.As“ zurück, der nicht *error sein sollte

PHPz
PHPznach vorne
2024-02-15 14:06:07438Durchsuche

在迭代测试结构时使用errors.As(),将第二个参数返回给errors.As 不应该是*error

php-Editor Strawberry hat beim Iterieren der Teststruktur einen Fehler festgestellt. Bei Verwendung von „errors.As()“ sollte der zweite Parameter, der an „errors.As“ zurückgegeben wird, ein Zeiger auf einen Fehler und kein Fehler sein. Dieser Fehler kann dazu führen, dass sich das Programm unerwartet oder falsch verhält. Achten Sie daher bei der Verwendung vonerrors.As() unbedingt auf den Typ des Parameters und stellen Sie sicher, dass ein Zeiger auf den Fehler übergeben wird, um Probleme zu vermeiden. Dieses Problem kann bei der Iteration über Teststrukturen auftreten. Seien Sie daher besonders vorsichtig, wenn Sie error.As() verwenden.

Frageninhalt

Ich schreibe derzeit einige Komponententests für ein Paket, bei dem Funktionen mehrere Arten von Fehlern zurückgeben können. Ich definiere die Struktur als:

tests := []struct {
    name   string
    data   string
    url    string
    status int
}

und errors.as() 在我测试的错误中查找 test.err nutzen möchte. Die Beispielstruktur, die ich in meinen Tests verwendet habe, ist wie folgt:

{
    name:   "url not available",
    err:    &url.error{},
    data:   srvdata,
    url:    "a",
    status: http.statusok,
},

Ich möchte errors.as 用于实现错误接口的不同结构类型。因此,正如您在结构中看到的那样,我将 err 定义为错误。可以看出,我使用 &url.error{} hinzufügen, das die Fehlerschnittstelle implementieren soll.

t.run(test.name, func(t *testing.t) {
    data, err := i.getid(url)
    if err != nil {
        require.notnil(t, test.err)
        assert.true(t, errors.as(err, &test.err))
    } else {
        // ...
    }
})

Die Verwendung von errors.as wie oben gibt jedoch

zurück
second argument to errors.As should not be *error

Soweit ich weiß, akzeptierterrors.as() any als zweites Argument, daher bin ich verwirrt, warum *error nicht verwendet werden kann.

Ich habe auch versucht, das Feld err in der Teststruktur in „interface{}“ zu ändern. Dadurch wurden jedoch alle Behauptungen bestanden, unabhängig davon, ob das Ziel im Fehler vorhanden war oder nicht.

Ich kann nicht herausfinden, wie ich errors.as() verwenden kann, um eine andere Art von Lösung zu implementieren, die die Fehlerschnittstelle auf ähnliche Weise wie oben implementiert, daher verlasse ich mich jetzt auf die Verwendung von contains () code> stattdessen. Ich frage mich, ob jemand einen Einblick geben kann. errors.as() 来实现以与上面类似的方式实现错误接口的不同类型的解决方案,所以现在我依靠使用 contains() 来代替。想知道是否有人可以提供一些见解。

解决方法

指向错误类型的指针不满足 error 接口,这就是为什么 as 的第二个参数的类型为 any。为了将您想要的类型直接存储在 .err 字段中,该字段也必须是 any

Problemumgehung

Der Zeiger auf den Fehlertyp erfüllt nicht die error-Schnittstelle, weshalb der zweite Parameter von as vom Typ 🎜 ist. Um den gewünschten Typ direkt im Feld .err zu speichern, muss das Feld auch vom Typ 🎜 sein. 🎜 🎜Da Sie diesen Zeigerwert jedoch in eine Schnittstelle eingeschlossen haben, müssen Sie die Typzusicherung oder -reflexion verwenden, um den Wert zur Überprüfung zu erhalten: 🎜
var testErr any = new(*url.Error)
_, err := http.Get("http://error.error/")

if errors.As(err, testErr) {
    fmt.Println(reflect.ValueOf(testErr).Elem())
}

Das obige ist der detaillierte Inhalt vonWenn Sie beim Durchlaufen der Teststruktur die Funktion „errors.As()“ verwenden, geben Sie den zweiten Parameter an „errors.As“ zurück, der nicht *error sein sollte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen