编写Golang单元测试的功能,该功能期望按键继续

时间:2018-12-27 03:47:55

标签: unit-testing go

我在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()之后调用

我是否需要在此处模拟某些东西以解决此错误?有什么想法吗?

1 个答案:

答案 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