Maison  >  Article  >  développement back-end  >  Comment se moquer d'une session netconf lors des tests unitaires Golang

Comment se moquer d'une session netconf lors des tests unitaires Golang

WBOY
WBOYavant
2024-02-12 15:42:16819parcourir

如何在单元测试 Golang 中模拟 netconf 会话

Contenu de la question

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

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer