Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan errors.As() apabila melelaran struktur ujian, kembalikan argumen kedua kepada errors.As tidak sepatutnya *error

Menggunakan errors.As() apabila melelaran struktur ujian, kembalikan argumen kedua kepada errors.As tidak sepatutnya *error

PHPz
PHPzke hadapan
2024-02-15 14:06:07483semak imbas

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

editor php Strawberry menemui ralat semasa mengulang struktur ujian. Apabila menggunakan ralat.As(), parameter kedua dikembalikan kepada ralat.As sepatutnya menjadi penunjuk kepada ralat, bukan ralat. Ralat ini boleh menyebabkan program berkelakuan tidak dijangka atau tidak betul. Oleh itu, apabila menggunakan ralat.As(), pastikan anda memberi perhatian kepada jenis parameter dan pastikan penunjuk kepada ralat dihantar untuk mengelakkan masalah. Masalah ini mungkin timbul apabila lelaran ke atas struktur ujian, jadi beri perhatian khusus apabila menggunakan ralat. As().

Kandungan soalan

Saya sedang menulis beberapa ujian unit untuk pakej yang fungsi boleh mengembalikan berbilang jenis ralat. Saya mentakrifkan struktur sebagai:

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

dan nak guna errors.as() 在我测试的错误中查找 test.err . Contoh struktur yang saya gunakan dalam ujian saya adalah seperti berikut:

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

Saya ingin menambah errors.as 用于实现错误接口的不同结构类型。因此,正如您在结构中看到的那样,我将 err 定义为错误。可以看出,我使用 &url.error{} , yang sepatutnya melaksanakan antara muka ralat.

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 {
        // ...
    }
})

Namun, menggunakan errors.as seperti di atas mengembalikan

second argument to errors.As should not be *error

Sekarang dari apa yang saya faham, errors.as() menerima any sebagai hujah kedua, jadi saya keliru mengapa *error tidak boleh digunakan.

Saya juga cuba menukar medan err dalam struktur ujian kepada antara muka{} walau bagaimanapun, berbuat demikian menjadikan semua penegasan lulus tanpa mengira sama ada sasaran terdapat dalam ralat atau tidak.

Saya tidak dapat mencari cara menggunakan errors.as() untuk melaksanakan jenis penyelesaian yang berbeza yang melaksanakan antara muka ralat dengan cara yang sama seperti di atas, jadi sekarang saya bergantung pada penggunaan contains () code> sebaliknya. Tertanya-tanya jika sesiapa boleh memberikan sedikit pandangan. errors.as() 来实现以与上面类似的方式实现错误接口的不同类型的解决方案,所以现在我依靠使用 contains() 来代替。想知道是否有人可以提供一些见解。

解决方法

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

Penyelesaian

Penunjuk kepada jenis ralat tidak memenuhi antara muka ralat, itulah sebabnya parameter kedua as adalah jenis 🎜. Untuk menyimpan jenis yang anda mahu terus dalam medan .err, medan tersebut juga mestilah jenis 🎜. 🎜 🎜Walau bagaimanapun, memandangkan anda telah membungkus nilai penunjuk ini dalam antara muka, anda perlu menggunakan penegasan jenis atau refleksi untuk mendapatkan nilai untuk pemeriksaan: 🎜
var testErr any = new(*url.Error)
_, err := http.Get("http://error.error/")

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

Atas ialah kandungan terperinci Menggunakan errors.As() apabila melelaran struktur ujian, kembalikan argumen kedua kepada errors.As tidak sepatutnya *error. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam