英文:
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)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论