英文:
How to make the function suit the _test file?
问题
这是我的代码:
type Queue interface {
	Push(key interface{})
	Pop() interface{}
	Contains(key interface{}) bool
	Len() int
	Keys() []interface{}
}
type QueueData struct {
	size int
	data []interface{}
}
func New(size int) *QueueData {
	return &QueueData{
		size: size,
	}
}
func (q *QueueData) IsEmpty() bool {
	return len(q.data) == 0
}
// Peek : 返回队列中的下一个元素
func (q *QueueData) Peek() (interface{}, error) {
	if len(q.data) == 0 {
		return 0, fmt.Errorf("队列为空")
	}
	return q.data[0], nil
}
// Queue : 将元素添加到队列中,并返回指向当前队列的指针
func (q *QueueData) Push(n interface{}) *QueueData {
	if q.Len() < q.size {
		q.data = append(q.data, n)
	} else {
		q.Pop()
		q.Push(n)
	}
	return q
}
// Dequeue : 从队列中移除下一个元素并返回其值
//func (q *QueueFix) Pop() (interface{}, error) {
func (q *QueueData) Pop() interface{} {
	if len(q.data) == 0 {
		//return 0, fmt.Errorf("队列为空")
		return 0
	}
	element := q.data[0]
	q.data = q.data[1:]
	//return element, nil
	return element
}
func (q *QueueData) Len() int {
	return len(q.data)
}
func (q *QueueData) Keys() []interface{} {
	return q.data
}
func (q *QueueData) Contains(key interface{}) bool {
	cont := false
	for i := 0; i < q.Len(); i++ {
		if q.data[i] == key {
			cont = true
		}
	}
	return cont
}
我的测试代码如下:
var testValues = []interface{}{
	"lorem",
	"ipsum",
	1,
	2,
	3,
	"jack",
	"jill",
	"felix",
	"donking",
}
// TestPush 验证淘汰旧项目策略
func TestEvictPolicy(t *testing.T) {
	size := 5
	q := New(size)
	for i, v := range testValues {
		q.Push(v)
		t.Log("当前队列: ", q.Keys())
		// 验证
		// 项目存在性
		if !q.Contains(v) {
			t.Errorf("策略: 新插入的 %v 必须存在", v)
		}
		if i < 5 && q.Len() != (i+1) {
			t.Errorf("期望长度 %d,实际长度: %d", i+1, q.Len())
		} else if i >= 5 && q.Len() != 5 {
			t.Errorf("期望长度: %d,实际长度: %d", size, q.Len())
		}
	}
}
// TestPop 验证弹出项目策略
func TestPop(t *testing.T) {
	size := 5
	q := New(size)
	for _, v := range testValues {
		q.Push(v)
	}
	for q.Len() > 0 {
		t.Log("当前队列: ", q.Keys())
		v := q.Pop()
		// 验证
		expect := testValues[len(testValues)-(q.Len()+1)]
		if v != expect {
			t.Errorf("期望值 %v,实际值 %v", expect, v)
		}
	}
}
测试返回了以下错误:
.\Queue_test.go:60:4: 错误调用可能有格式化指令 %v
FAIL /C/Users/richa/go/src [构建失败]
我不明白如何从_test.go文件中创建代码。需要解释如何创建_test.go文件。只需给出一些关于此测试的参考资料,例如当我添加EvictPolicy函数时,它说未声明...
英文:
Here was my code
type Queue interface {
	Push(key interface{})
	Pop() interface{}
	Contains(key interface{}) bool
	Len() int
	Keys() []interface{}
}
type QueueData struct {
	size int
	data []interface{}
}
func New(size int) *QueueData {
	return &QueueData{
		size: size,
	}
}
func (q *QueueData) IsEmpty() bool {
	return len(q.data) == 0
}
// Peek : returns the next element in the queue
func (q *QueueData) Peek() (interface{}, error) {
	if len(q.data) == 0 {
		return 0, fmt.Errorf("Queue is empty")
	}
	return q.data[0], nil
}
// Queue : adds an element onto the queue and returns an pointer to the current queue
func (q *QueueData) Push(n interface{}) *QueueData {
	if q.Len() < q.size {
		q.data = append(q.data, n)
	} else {
		q.Pop()
		q.Push(n)
	}
	return q
}
// Dequeue : removes the next element from the queue and returns its value
//func (q *QueueFix) Pop() (interface{}, error) {
func (q *QueueData) Pop() interface{} {
	if len(q.data) == 0 {
		//return 0, fmt.Errorf("Queue is empty")
		return 0
	}
	element := q.data[0]
	q.data = q.data[1:]
	//return element, nil
	return element
}
func (q *QueueData) Len() int {
	return len(q.data)
}
func (q *QueueData) Keys() []interface{} {
	return q.data
}
func (q *QueueData) Contains(key interface{}) bool {
	cont := false
	for i := 0; i < q.Len(); i++ {
		if q.data[i] == key {
			cont = true
		}
	}
	return cont
}
My Test is look like this...
var testValues = []interface{}{
	"lorem",
	"ipsum",
	1,
	2,
	3,
	"jack",
	"jill",
	"felix",
	"donking",
}
// TestPush validate evict old item policy
func TestEvictPolicy(t *testing.T) {
	size := 5
	q := New(size)
	for i, v := range testValues {
		q.Push(v)
		t.Log("current: ", q.Keys())
		// validate
		// item existence
		if !q.Contains(v) {
			t.Errorf("policy: newly inserted %v must be exists", v)
		}
		if i < 5 && q.Len() != (i+1) {
			t.Errorf("expected length %d but actual: %d", i+1, q.Len())
		} else if i >= 5 && q.Len() != 5 {
			t.Errorf("expexted length: %d but actual: %d", size, q.Len())
		}
	}
}
// TestPop validate pop item policy
func TestPop(t *testing.T) {
	size := 5
	q := New(size)
	for _, v := range testValues {
		q.Push(v)
	}
	for q.Len() > 0 {
		t.Log("current: ", q.Keys())
		v := q.Pop()
		// validate
		expect := testValues[len(testValues)-(q.Len()+1)]
		if v != expect {
			t.Error("expected %v but recevied %v", expect, v)
		}
	}
}
The test returned
> .\Queue_test.go:60:4: Error call has possible formatting directive %v
> FAIL    /C/Users/richa/go/src [build failed]
I didn't i understand how to make an code from _test.go file. Need an explain how to make the _test.go aswell. Just give some reference for this testing. like when i add EvictPolicy Function, itsay undeclared...
答案1
得分: 2
你看到的错误信息是这样的:
Queue_test.go:60:4: Error call has possible formatting directive %v FAIL
看起来是指的这一行代码:
t.Error("expected %v but recevied %v", expect, v)
在这一行中,你调用了t.Error来打印错误信息,并将expect和v变量格式化为错误字符串。但是,t.Error并不会对额外的参数进行格式化,它只是将它们打印出来。
你应该像对其他错误信息一样调用t.Errorf。
英文:
The error you are seeing
Queue_test.go:60:4: Error call has possible formatting directive %v FAIL
Looks to be referring to this line
t.Error("expected %v but recevied %v", expect, v)
On this line you called t.Error to print the error message and format the expect and v vars into the error string. But, t.Error does not format the additional arguments. It just prints them.
You should call t.Errorf like you did for your other error messages.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论