Maison > Article > développement back-end > Comment se moquer d'une session netconf lors des tests unitaires Golang
J'utilise le package netconf de Juniper ("github.com/juniper/go-netconf/netconf") pour établir une session netconf dans mon code.
Je veux savoir comment simuler une session netconf dans un test unitaire.
Ma méthode est la suivante :
func testmyfunction(t *testing.t) { getsshconnection = mockgetsshconnection got := myfunction() want := 123 if !reflect.deepequal(got, want) { t.errorf("error expectation not met, want %v, got %v", want, got) } }
func mockgetsshconnection() (*netconf.session, error) { var sess netconf.session sess.sessionid = 123 return &sess, nil }
Le problème survient lorsque myfunction() a une ligne qui retarde sess.close() et renvoie une erreur en raison du déréférencement nul du pointeur
func MyFunction() int { sess, err := getSSHConnection() // returns (*netconf.Session, error) if err == nil && sess != nil { defer sess.Close() -> Problem happens here // Calls RPC here and rest of the code here } return 0 }
Alors, quelles modifications puis-je apporter à la méthode mockgetsshconnection() pour que sess.close() ne génère pas d'erreur ? Simulez-le et utilisez-le dans des exemples réels de
nil
指针错误源自 close
函数 当底层transport
调用close
时。幸运的是 transport
是一个 interface
类型,您可以轻松地在 netconf.session
. Par exemple comme ceci :
type MockTransport struct{} func (t *MockTransport) Send([]byte) error { return nil } func (t *MockTransport) Receive() ([]byte, error) { return []byte{}, nil } func (t *MockTransport) Close() error { return nil } func (t *MockTransport) ReceiveHello() (*netconf.HelloMessage, error) { return &netconf.HelloMessage{SessionID: 123}, nil } func (t *MockTransport) SendHello(*netconf.HelloMessage) error { return nil } func (t *MockTransport) SetVersion(version string) { } func mockGetSSHConnection() (*netconf.Session, error) { t := MockTransport{} sess := netconf.NewSession(&t) return sess, nil }
Veuillez noter que la fonction que vous souhaitez tester revient actuellement 0
而不是会话的 sessionid
. Par conséquent, vous devez résoudre le problème avant la réussite du test.
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!