éditeur php Baicao La comparaison des tranches Go et des éléments NaN est un problème courant dans les tests unitaires. Lorsqu'il s'agit de tranches, nous devons souvent comparer deux tranches pour vérifier leur égalité, mais la comparaison devient compliquée lorsqu'une tranche contient NaN éléments. NaN est un nombre à virgule flottante spécial, ce qui signifie qu'il ne s'agit pas d'une valeur numérique. Dans Go, utilisez la fonction IsNaN du package mathématique pour déterminer si un nombre à virgule flottante est NaN. Nous pouvons implémenter des opérations de comparaison de tranches en parcourant chaque élément de la tranche et en utilisant la fonction IsNaN pour déterminer s'il s'agit de NaN.
J'ai besoin de comparer 2 tranches dans un test unitaire, je pense que le package assert
devrait résoudre ce problème, mais il ne fonctionne pas avec nan :
import ( "github.com/stretchr/testify/assert" ) func callme() []float64 { return []float64{math.nan()} } func testcallme(t *testing.t) { assert.equal(t, []float64{math.nan()}, callme()) }
Le résultat est :
Error: Not equal: expected: []float64{NaN} actual : []float64{NaN} Diff: Test: TestCallMe
Je sais qu'une des propriétés de nan n'est pas égale à elle-même, mais par contre je reçois le résultat attendu de la fonction.
Je veux savoir comment résoudre ce problème : obtenir des assertions de tests unitaires concises et un résultat clair ?
Comme alternative, je pourrais éviter d'utiliser assert
并在两个切片的每个元素上调用 math.isnan
et appeler math.isnan
sur chaque élément des deux tranches, mais cela semblerait extrêmement verbeux dans un test unitaire.
github.com/google/go-cmp/cmp<通常建议使用 /a> package pour des comparaisons plus complexes. cmpopts.equatenans peut être utilisé pour comparer facilement les structures de données pouvant contenir nan.
package calc_test import ( "math" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" ) func calc(n float64) []float64 { return []float64{n, math.NaN()} } func TestCalc(t *testing.T) { want := []float64{1, math.NaN()} got := calc(1) // PASS. if !cmp.Equal(got, want, cmpopts.EquateNaNs()) { t.Errorf("calc: got = %v; want = %v", got, want) } got = calc(2) // FAIL with differences. if diff := cmp.Diff(want, got, cmpopts.EquateNaNs()); diff != "" { t.Errorf("calc: diff (-want +got) = \n%s", diff) } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!