如何帮助Go测试找到自定义类型声明?

时间:2017-01-03 17:33:54

标签: go unicode

我正在通过声明类型

来测试Go对Unicode的支持
type Эксперимент struct {
    Строка string
}
package испытание

,并尝试导入单元测试。但是,当我尝试这个时,我收到一个错误。

跟踪:

$ go test
# github.com/mcandre/mcandre/go/испытание_test
./испытание_test.go:10: undefined: Эксперимент
FAIL    github.com/mcandre/mcandre/go/испытание [build failed]

来源:

https://github.com/mcandre/mcandre/tree/master/go/испытание

我是否正确地将公众成员资本化? go doc显示我的结构公开列出:

$ go doc
package испытание // import "github.com/mcandre/mcandre/go/испытание"

Package испытание demonstrates Unicode capabilities in Go source code.

type Эксперимент struct { ... }
    func Испытание() Эксперимент

也许Go编译器在令牌中有西里尔符文的问题?

1 个答案:

答案 0 :(得分:2)

Spec: Exported Identifiers:

引用
  

如果标识符名称的第一个字符是Unicode大写字母(Unicode类" Lu"),则导出标识符;和[...]

西里尔符文(Go处理得很好)没有任何问题,Unicode类中的所有字符都是" Lu" (Letter,uppercased)被接受,但是当您导入包时,您必须使用包名来构造qualified identifiers以从包中引用exported identifiers

在测试中更改此行:

wanted := Эксперимент{Строка: "Испытание!"}

对此:

wanted := испытание.Эксперимент{Строка: "Испытание!"}

一旦你这样做,它就会通过。正在运行go test

PASS
ok      github.com/mcandre/mcandre/go/испытание 0.001s

有关详细信息,请参阅此相关问题:Getting a use of package without selector error

关于包名称的说明

您需要使用限定标识符,因为您为测试文件使用了不同的包。您可以选择使用相同的包,在这种情况下,您不得导入包(这将是一个不允许的导入循环),在这种情况下,您不需要使用合格的标识符,您可以使用包的所有导出的未导出的标识符。

这是使用相同包的测试文件的样子:

package испытание

import (
        "testing"
)

func TestИспытаниеReturnsИспытание(t *testing.T) {
        wanted := Эксперимент{Строка: "Испытание!"}
        observed := Испытание()

        if observed != wanted {
                t.Errorf("испытание.Испытание(): Wanted %s, got %s\n", wanted, observed)
        }
}

使用相同的包名称称为白盒测试,使用不同的包名称称为黑盒测试。您可以在此处详细了解:Where to put shared code for tests in a Go package?

关于更改名称的注意事项

使用import declarations,您还可以更改要用于引用导入的包标识符的名称;您甚至可以使用.(点)代替名称,在这种情况下,您可以省略限定标识符中的名称。有关详细信息,请参阅:Import struct from another package and file golang