问题内容 我正在使用 juniper 的 netconf 包(“GitHub.com/juniper/Go-netconf/netconf”)在我的代码中建立 netconf 会话。
我正在使用 juniper 的 netconf 包(“GitHub.com/juniper/Go-netconf/netconf”)在我的代码中建立 netconf 会话。
我想知道如何在单元测试中模拟 netconf 会话。
我的方法是:
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
}
当 myfunction() 有一行延迟 sess.close() 并且由于 nil 指针取消引用而引发错误时,就会出现问题
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
}
那么,我可以对mockgetsshconnection()方法进行哪些更改,以便sess.close()不会抛出错误?
nil
指针错误源自 close
函数 当底层transport
调用close
时。幸运的是 transport
是一个 interface
类型,您可以轻松地在 netconf.session
的实际实例中模拟和使用它。例如像这样:
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
}
请注意,您要测试的函数当前返回 0
而不是会话的 sessionid
。因此,您应该在测试成功之前修复该问题。
--结束END--
本文标题: 如何在单元测试 Golang 中模拟 netconf 会话
本文链接: https://www.lsjlt.com/news/563856.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0