在我的情况下,我应该如何正确地测试方法?

huangapple go评论67阅读模式
英文:

How can I test method in proper way in my case?

问题

我已经为教育目的编写了这段代码,现在我需要为它编写一些测试。首先,我需要测试Worker方法,但我不明白如何正确地进行测试。我对测试和Go语言都完全不熟悉。

我写了一些测试代码,我想检查当将ctx.Done()传递给通道时,Worker方法是否返回nil。现在这个测试不起作用,可能是因为worker方法中有一个无限循环。然后,我需要检查方法是否从队列中获取消息并将其传递给Download方法。

package worker

import (
	"context"
	"errors"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/mock"
)

type MockQueue struct {
	mock.Mock
}

type MockDownloader struct {
	mock.Mock
}

func (m *MockQueue) TakeMessage() (<-chan string, error) {
	strCh := make(chan string)
	strCh <- "some_url/some.txt"
	return strCh, nil
}

func (d *MockDownloader) Download(url string) error {
	if url == "some_url/some.txt" {
		return nil
	} else {
		return errors.New(url)
	}
}

func TestWorkerCloseContext(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	resultCh := make(chan error)
	newQueue := &MockQueue{}
	newDownload := &MockDownloader{}
	newWorker := Worker{newQueue, newDownload}
	go func() {
		resultCh <- newWorker.Worker(ctx)
	}()
	cancel()
	assert.Nil(t, <-resultCh)
}

func TestWorkerMessageReceive(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	resultCh := make(chan error)
	newQueue := &MockQueue{}
	newDownload := &MockDownloader{}
	newWorker := Worker{newQueue, newDownload}
	go func() {
		resultCh <- newWorker.Worker(ctx)
	}()
	// 这里是一些代码
}

希望这可以帮助你进行测试。如果你有任何其他问题,请随时问我。

英文:

I've written this code for education purposes, now I need to write some test for it.
First, I need to test method Worker, but I don't understand how can I do it properly?
I'm totally new to test and to Go generally.

package worker
import (
&quot;context&quot;
&quot;fmt&quot;
)
type Queue interface {
TakeMessage() (&lt;-chan string, error)
}
type Download interface {
Download(url string) error
}
type Worker struct {
queue    Queue
download Download
}
func NewWorker(queue Queue, download Download) *Worker {
newWorker := Worker{}
newWorker.queue = queue
newWorker.download = download
return &amp;newWorker
}
func (w *Worker) Worker(ctx context.Context) error {
msgs, err := w.queue.TakeMessage()
if err != nil {
return fmt.Errorf(&quot;error while consume queue: %w&quot;, err)
}
for {
select {
case &lt;-ctx.Done():
return nil
case msg := &lt;-msgs:
fmt.Println(msg)
w.download.Download(msg)
}
}
}

I write some lines of testing code and I suppossed to check if Worker return nil when ctx.Done() is passed to channel Now this test doesn't work, it's stuck maybe because of infinite cycle in worker method. Then I need to check if method takes messages from queue and pass it to Download method.

package worker
import (
&quot;context&quot;
&quot;errors&quot;
&quot;testing&quot;
&quot;github.com/stretchr/testify/assert&quot;
&quot;github.com/stretchr/testify/mock&quot;
)
type MockQueue struct {
mock.Mock
}
type MockDownloader struct {
mock.Mock
}
func (m *MockQueue) TakeMessage() (&lt;-chan string, error) {
strCh := make(chan string)
strCh &lt;- &quot;some_url/some.txt&quot;
return strCh, nil
}
func (d *MockDownloader) Download(url string) error {
if url == &quot;some_url/some.txt&quot; {
return nil
} else {
return errors.New(url)
}
}
func TestWorkerCloseContext(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
resultCh := make(chan error)
newQueue := &amp;MockQueue{}
newDownload := &amp;MockDownloader{}
newWorker := Worker{newQueue, newDownload}
go func() {
resultCh &lt;- newWorker.Worker(ctx)
}()
cancel()
assert.Nil(t, &lt;-resultCh)
}
func TestWorkerMessageReceive(t \*testing.T) {
ctx, cancel := context.WithCancel(context.Background())
resultCh := make(chan error)
newQueue := &amp;MockQueue{}
newDownload := &amp;MockDownloader{}
newWorker := Worker{newQueue, newDownload}
go func() {
resultCh \&lt;- newWorker.Worker(ctx)
}()
//some code here
}

答案1

得分: 2

Go语言自带了一个相当丰富的内置测试库。请参考https://pkg.go.dev/testing。

我建议你看一下以下教程:

英文:

Go comes with a pretty extensive built-in testing library. See https://pkg.go.dev/testing

I would recommend looking at the below tutorials:

huangapple
  • 本文由 发表于 2022年9月9日 21:20:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/73662830.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定