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.
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
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
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!