登录
首页 >  Golang >  Go问答

如何对 golang 中的 promptui 包进行单元测试?

来源:stackoverflow

时间:2024-03-05 09:12:28 485浏览 收藏

今天golang学习网给大家带来了《如何对 golang 中的 promptui 包进行单元测试?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我是 golang 新手,我在我的一个项目中使用名为 promptui (https://github.com/manifoldco/promptui) 的交互式提示。我已经为这个项目编写了几个单元测试,但我正在努力解决如何对这个需要输入的特定包进行单元测试的问题。

例如,我将如何测试以下代码行(封装在函数中):

func setEmail() string {
  prompt := promptui.Prompt{Label: "Input your Email",
     Validate: emailValidations,
  }

  email, err := prompt.Run()
  if err != nil {
    color.red("failed getting email")
    os.exit(3)
  }
  return email
}

我认为我需要以某种方式模拟标准输入,但无法找出在测试中做到这一点的最佳方法。


解决方案


您不应尝试测试 promptui,因为它预计将由其作者进行测试。

您可以测试什么:

  1. 您在创建 promptui.prompt 时发送了正确的参数
  2. 您在代码中使用 promptui.prompt
  3. 您正确处理了 promptui.prompt 结果

正如您所看到的,所有这些测试都没有验证 promptui.prompt 内部是否正常工作。

测试 #2 和 #3 可以合并。您需要针对模拟运行代码,如果得到正确的结果,您可以相信 #2 和 #3 都是正确的。

创建模拟:

type runner interface {
    run() (int, string, error)
}

type promptmock struct {
    // t is not required for this test, but it is would be helpful to assert input parameters if we have it in run()
    t *testing.t
}

func (p promptmock) run() (int, string, error) {
    // return expected result
    return 1, "", nil
}

您将需要单独的模拟来测试错误流。

更新代码以注入模拟:

func setemail(runner runner) string {
    email, err := runner.run()
    if err != nil {
      color.red("failed getting email")
      os.exit(3)
    }
    return email
}

现在可以测试了。

创建创建 prompt 的函数:

func getRunner() promptui.Prompt {
  return promptui.Prompt{Label: "Input your Email",
     Validate: emailValidations,
  }
}

编写简单的断言测试来验证我们创建的结构是否正确。

唯一未测试的行是 setemail(getrunner()) 但它很简单,可以被其他类型的测试覆盖。

今天关于《如何对 golang 中的 promptui 包进行单元测试?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>