英文:
Using testing.T as anonymous struct field: "too many arguments in call to this.T.common.Fail"
问题
我正在尝试使用Go语言解决Karate Chop kata作为练习,但在我的测试用例中遇到了这个编译器错误:
> too many arguments in call to this.T.common.Fail
我将testing.T
包装成一个带有额外方法的结构体,作为匿名结构体字段:
package main
import (
"fmt"
"testing"
)
type assertions struct {
*testing.T
}
func (this assertions) assert_equal(expected int, actual int) {
if (expected != actual) {
this.Fail(fmt.Sprintf("Failed asserting that %v is %v", actual, expected));
}
}
func TestChop(t *testing.T) {
test := assertions{t}
test.assert_equal(-1, Chop(3, []int{}))
test.assert_equal(-1, Chop(3, []int{1}))
...
}
我期望this.Fail
调用匿名的testing.T
结构体字段上的Fail()
方法,该方法接受一个字符串参数。为什么情况不是这样,并且this.T.common.Fail
是从哪里来的?我在testing
包的文档中找不到任何关于common
的参考。
英文:
I am trying to solve the Karate Chop kata in Go as an exercise and stuck with this compiler error from my test case:
> too many arguments in call to this.T.common.Fail
I wrapped testing.T
into a struct with additional methods, as an anonymous struct field:
package main
import (
"fmt"
"testing"
)
type assertions struct {
*testing.T
}
func (this assertions) assert_equal(expected int, actual int) {
if (expected != actual) {
this.Fail(fmt.Sprintf("Failed asserting that %v is %v", actual, expected));
}
}
func TestChop(t *testing.T) {
test := assertions{t}
test.assert_equal(-1, Chop(3, []int{}))
test.assert_equal(-1, Chop(3, []int{1}))
...
}
I expect this.Fail
to call Fail()
on the anonymous testing.T
struct field, which takes a string parameter. Why isn't this the case and where does this.T.common.Fail
come from? I cannot find any reference to common
in the testing
package documentation.
答案1
得分: 3
以下是翻译好的内容:
> 源文件 src/testing/testing.go
>
>
> // Fail将函数标记为失败,但继续执行。
> func (c *common) Fail() {
> c.mu.Lock()
> defer c.mu.Unlock()
> c.failed = true
> }
>
> // common保存T和B之间的共同元素,并捕获Errorf等常用方法。
> type common struct {
> mu sync.RWMutex // 保护output和failed
> output []byte // 测试或基准测试生成的输出。
> failed bool // 测试或基准测试失败。
> skipped bool // 测试或基准测试已跳过。
> finished bool
>
> start time.Time // 测试或基准测试开始时间
> duration time.Duration
> self interface{} // 完成时要发送到信号通道的内容。
> signal chan interface{} // 串行测试的输出。
> }
>
> // T是传递给Test函数以管理测试状态并支持格式化测试日志的类型。
> // 在执行过程中,日志会累积,并在完成时转储到标准错误。
> type T struct {
> common
> name string // 测试的名称。
> startParallel chan bool // 并行测试将等待此通道。
> }
>
> func (*T) Fail
>
> func (c *T) Fail()
>
> Fail将函数标记为失败,但继续执行。
T.common.Fail()
没有参数。
尝试使用Errorf
:
> func (*T) Errorf
>
> func (c *T) Errorf(format string, args ...interface{})
>
> Errorf等效于Logf,然后是Fail。
例如,
this.Errorf("断言失败:%v 不等于 %v", actual, expected)
英文:
> Source file src/testing/testing.go
>
>
> // Fail marks the function as having failed but continues execution.
> func (c *common) Fail() {
> c.mu.Lock()
> defer c.mu.Unlock()
> c.failed = true
> }
>
> // common holds the elements common between T and B and
> // captures common methods such as Errorf.
> type common struct {
> mu sync.RWMutex // guards output and failed
> output []byte // Output generated by test or benchmark.
> failed bool // Test or benchmark has failed.
> skipped bool // Test of benchmark has been skipped.
> finished bool
>
> start time.Time // Time test or benchmark started
> duration time.Duration
> self interface{} // To be sent on signal channel when done.
> signal chan interface{} // Output for serial tests.
> }
>
> // T is a type passed to Test functions to manage test state and support formatted test logs.
> // Logs are accumulated during execution and dumped to standard error when done.
> type T struct {
> common
> name string // Name of test.
> startParallel chan bool // Parallel tests will wait on this.
> }
>
> func (*T) Fail
>
> func (c *T) Fail()
>
> Fail marks the function as having failed but continues execution.
There are no arguments to T.common.Fail()
.
Try Errorf
:
> func (*T) Errorf
>
> func (c *T) Errorf(format string, args ...interface{})
>
> Errorf is equivalent to Logf followed by Fail.
For example,
this.Errorf("Failed asserting that %v is %v", actual, expected)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论