2013-06-25 11 views
7

Biorąc pod uwagę te przypadki dwa testy:Testowanie głębokiej równości z json Organizowanie w golang

func TestEqualWhat(t *testing.T) { 
    testMarshalUnmarshal(t, map[string]interface{}{"a":"b"}) 
    testMarshalUnmarshal(t, map[string]interface{}{"a":5}) 
} 

Jeżeli pomocnik testMarshalUnmarshal właśnie Marszałkowie do JSON i wycofać:

func testMarshalUnmarshal(t *testing.T, in map[string]interface{}) { 
    //marshal the object to a string 
    jsb, err := json.Marshal(in); 
    if err != nil { 
     log.Printf("Unable to marshal msg") 
     t.FailNow() 
    } 

    //unmarshal to a map 
    res := make(map[string]interface{}) 
    if err := json.Unmarshal(jsb, &res); err != nil { t.FailNow() } 

    if !reflect.DeepEqual(in, res) { 
     log.Printf("\nExpected %#v\nbut got %#v", in, res) 
     t.FailNow() 
    } 
} 

Dlaczego pierwszy przypadek testowy przejść, a drugi nie? Wynikiem testu jest taka:

Expected map[string]interface {}{"a":5} 
but got map[string]interface {}{"a":5} 
--- FAIL: TestEqualWhat (0.00 seconds) 

Here is similar code on the go playground więc można mieć hack na nią łatwo.

Odpowiedz

13

Wymyśliłem! JSON ma tylko jeden typ liczbowy, który jest zmiennoprzecinkowy, więc wszystkie liczby całkowite są konwertowane na Float64 w procesie marshal/unsimhal. Tak więc, na mapie res, 5 jest float64 zamiast int.

Here to zabawny plac zabaw zapewniający kontekst i dowód na to, o czym mówię.