我在Golang中有一个类似这样的函数:
func Exit(code int) {
...
...
...
keyboard.Open()
defer keyboard.Close()
keyboard.GetKey()
PrintAndLogInfo("\nBye.")
os.Exit(code)
}
我正在使用以下库来使用此键盘功能
github.com/eiannone/keyboard
我想为此功能编写单元测试。但是,keyboard.GetKey()需要按下一个键。可能因为这个原因,当我运行调用函数Exit
的测试时,它失败并显示以下错误:
恐慌:应在Open()之后调用函数GetKey()[恢复] 恐慌:函数GetKey()应该在Open()之后调用
我是否需要在此处模拟某些东西以解决此错误?有什么想法吗?
答案 0 :(得分:1)
实际上,错误function GetKey() should be called after Open()
由keyboard.GetKey()
触发。似乎GetKey()
认为从未调用过Open()
。
现在,在您的示例中,我们确实看到了keyboard.Open()
-但是Open()
实际上可以返回一个error
,您似乎忽略了它。
因此,您应该检查错误所在并在代码中进行处理。
但是,这实际上并不能解决您的问题-因为您可能不想每次运行单元测试(尤其是不在CI环境中)时都按一个键。
就像您说的那样,我会模拟键盘库。即:编写一个满足您需要的功能的接口,编写一个简单调用keyboard
库的接口的实现,并编写一个模拟实现以帮助测试。然后,该模拟可以直接从GetKey()
(或您在您的接口中称为的任何名称)返回。更高级的模拟可能具有一些配置,可以直接返回,稍作睡眠或永不返回。
我已经创建了一个简单的示例,请参见https://gist.github.com/jorygeerts/e887856cc15b64cb9681639cd83c4a37。请注意,对于您的测试,您可能还想注入一些东西来模拟os.Exit()
,也许还可以注入PrintAndLogInfo
。