-3

ここに私のコードがありました

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
}

私のテストは次のようになります...

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)
        }
    }

}

テストが返ってきました

.\Queue_test.go:60:4: エラー コールにフォーマット ディレクティブの可能性があります %v FAIL /C /Users/richa/go/src [ビルドに失敗しました]

_test.go ファイルからコードを作成する方法がわかりませんでした。_test.go の作り方も説明が必要です。このテストの参考にしてください。EvictPolicy関数を追加したときのように、宣言されていないと言います...

4

1 に答える 1

1

表示されているエラー

Queue_test.go:60:4: Error call has possible formatting directive %v FAIL

この行を参照しているように見えます


t.Error("expected %v but recevied %v", expect, v)

この行で、エラー メッセージを出力し、変数と変数をエラー文字列にt.Errorフォーマットするために呼び出しました。ただし、追加の引数をフォーマットしません。それらを印刷するだけです。expectvt.Error

t.Errorf他のエラー メッセージに対して行ったように呼び出す必要があります。

于 2021-10-30T06:21:24.973 に答える