首页 > 解决方案 > 具有公共构造函数的私有类型的表驱动测试

问题描述

我试图减少我的 API 的表面积,所以我使我的app结构不导出(使用小写名称),并且只公开了New函数:

package mylib

type app struct {
}

func New() *app {
    return &app{}
}

但是现在,我想为这个东西写一个表驱动的测试,我不能mylib.app在一个结构中保存一个:

package mylib_test

import (
    "testing"
    "mylib"
)

func TestApp(t *testing.T) {
    tests := []struct {
        name string
        app  private_type_public_new.app // This part doesn't work

    }{
        // ...
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {

        })
    }
}

我有什么选择?我应该将应用程序结构公开(App)并保留所有未导出的字段吗?我可以用高阶函数做一些有趣的事情来存储New函数实例以在子测试中实例化应用程序吗?还有什么?

标签: gotestingprivate

解决方案


我有什么选择?我应该将应用程序结构公开(App)并保留所有未导出的字段吗?

是的,将其导出为App. golang/lint(现已弃用)特别警告引用未导出类型的导出函数,因为它们很难让您的包的消费者使用。例如,如果你指定x := mylib.New()了一个 ,x的实例,除了它的类型之外*myapp.appgo-pls不会显示任何关于这个变量的信息,这意味着你附加到它的任何描述性注释都不会出现。

https://github.com/golang/lint/issues/210


推荐阅读