繁体   English   中英

我如何对用golang编写的这个promptui包进行单元测试?

How do I unit test this promptui package written in golang?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我是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
}

我想我需要以某种方式模拟stdin,但无法找出在测试中做到这一点的最佳方法。

2 个回复

您不应该尝试测试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
}

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

更新你的代码以注入mock:

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())但它很简单,可以被其他类型的测试覆盖。

无论出于何种原因,他们不会导出他们的stdin界面( https://github.com/manifoldco/promptui/blob/master/prompt.go#L49 ),所以你不能嘲笑它,但你可以直接嘲笑os.Stdin并预先os.Stdin测试所需的一切。 虽然我同意@Adrian,但它有自己的测试,所以这不应该是必要的。

从源中提取和重构/简化: 填写os.Stdin以获取从中读取的函数

以这种方式重构,它可以用于从os.Stdin读取并期望特定字符串的任何函数。

游乐场链接: https//play.golang.org/p/rjgcGIaftBK

func TestSetEmail(t *testing.T) {
    if err := TestExpectedStdinFunc("email@test.com", setEmail); err != nil {
        t.Error(err)
        return
    }
    fmt.Println("success")
}

func TestExpectedStdinFunc(expected string, f func() string) error {
    content := []byte(expected)
    tmpfile, err := ioutil.TempFile("", "example")
    if err != nil {
        return err
    }

    defer os.Remove(tmpfile.Name()) // clean up

    if _, err := tmpfile.Write(content); err != nil {
        return err
    }

    if _, err := tmpfile.Seek(0, 0); err != nil {
        return err
    }

    oldStdin := os.Stdin
    defer func() { os.Stdin = oldStdin }() // Restore original Stdin

    os.Stdin = tmpfile
    actual := f()
    if actual != expected {
        return errors.New(fmt.Sprintf("test failed, exptected: %s actual: %s", expected, actual))
    }

    if err := tmpfile.Close(); err != nil {
        return err
    }
    return nil
}
1 如何打包golang测试帮助程序代码?

我在golang库中有一些测试助手代码,我想在各种子包中进行测试时使用它们。 但是,我遇到了障碍: 要使用test_helpers_test.go的代码,我必须导入外部包。 但是当我从something_test.go导入外包时,它会抱怨“导入循环不允许在测试中” 所以我尝试为 ...

2 单元测试应如何编写?

我想为指令编写单元测试,如下所示: 我应该如何编写单元测试以确认仅当MyConfig.adjusttop设置为true时才调整顶部位置? 我可以使用spyOn来检测是否曾经被调用过的adjustTop()函数吗? 如果可以,如何使用? ...

3 我如何对流星包进行单元测试?

我正在使用流星 + mongodb + 反应。 meteor add meteortesting:mocha 导入/用户界面中的 .test 文件已运行,但我对包的测试无法识别。 你知道我如何在包上运行测试吗? 流星文档没有更新。 他们使用practicalmeteor:mocha但现在已弃用。 ...

4 如何对用GLSL编写的OpenGL着色器进行单元测试?

我是OpenGL和GLSL的新手。 我想使用TDD着色器,但是除了glsl-unit(似乎是WebGL特定的)之外,没有找到任何有关该主题的内容。 是否有“标准”的单元测试着色器方法? 这方面的最佳做法是什么? 是否有GLSL的单元测试框架? 如果有帮助,我的目标是针对iOS设 ...

5 如何在64位计算机上单元测试32位SSIS软件包?

我必须创建一个SSIS包来移动一些数据。 我可以在64位开发计算机上编写SSIS程序包,但SSIS仅在32位计算机上运行。 很简单,我可以制作出看起来应该可以工作的东西并将其交给QA,但是我想为此编写单元测试,甚至还可以进行TTD。 有什么办法可以做到这一点,还是必须跳过单元测试? ...

6 如何在Golang中为HTTP请求编写单元测试?

我不知道如何测试以下代码中给出的http响应。 借助一些参考资料,我为此编写了单元测试,如下所示 响应是我从服务器获得的响应。 这总是给我不同的错误。 got invalid character '<' looking for beginning of value, wa ...

8 使用 unittest 和 pytest 包编写的测试的单元测试覆盖率报告

在我目前正在做的项目中,我的同事很少使用 unittest 包编写单元测试,有些使用 pytest 包。 当我在 CI 管道中运行单元测试时,我调用了所有单元测试。 但是,我们现在还需要获得整体代码覆盖包。 因此,我通过添加覆盖率更新了单元测试调用脚本(请参阅下面的脚本片段)。 但是,我看到当我在脚 ...

9 如何使用Golang实施单元测试程序?

我看到很多博客都写了如何进行单元测试的文章,但是我会理解理论部分而不理解如何执行测试用例,谁能告诉我我将如何实现第一个测试用例以进一步理解单元测试。 在这里,我正在平均实施小程序: 文件夹结构为:- 这两个文件中的代码是: main.go math_test.go ...

10 数据转换应如何编写单元测试?

通常,我的工作流程如下: 在数据库上执行SQL查询, 加载到内存 根据逻辑foo()转换数据 将转换后的数据插入数据库中的表。 对于这种工作流程应如何编写单元测试? 我真的是测试新手。 无论如何,我正在使用Python 3.4。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM