Я создал быстрый и легкий API в Go, который запрашивает ElasticSearch. Теперь, когда я знаю, что это можно сделать, я хочу сделать это правильно, добавив тесты. Я отвлек часть своего кода, чтобы его можно было тестировать на единицу, но у меня были некоторые проблемы, издевавшиеся над эластичной библиотекой, и поэтому я полагал, что было бы лучше, если бы я попробовал простой случай, чтобы издеваться над этим.Golang Mocking with Elastic
import (
"encoding/json"
"github.com/olivere/elastic"
"net/http"
)
...
func CheckBucketExists(name string, client *elastic.Client) bool {
exists, err := client.IndexExists(name).Do()
if err != nil {
panic(err)
}
return exists
}
А теперь тест ...
import (
"fmt"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"testing"
)
type MockClient struct {
mock.Mock
}
func (m *MockClient) IndexExists(name string) (bool, error) {
args := m.Mock.Called()
fmt.Println("This is a thing")
return args.Bool(0), args.Error(1)
}
func TestMockBucketExists(t *testing.T) {
m := MockClient{}
m.On("IndexExists", "thisuri").Return(true)
>> r := CheckBucketExists("thisuri", m)
assert := assert.New(t)
assert.True(r, true)
}
К которому я уступил со следующей ошибкой: cannot use m (type MockClient) as type *elastic.Client in argument to CheckBucketExists
.
Я предполагаю, что это что-то фундаментальное с моим использованием типа эластичный .client, но я все еще слишком много нуба.
Первоначально это был мой вопрос, и я многого не делал с тех пор, как я опубликовал эти годы назад. [CodeReviewComments # Интерфейсы] (https://github.com/golang/go/wiki/CodeReviewComments#interfaces) предполагает, что внешняя библиотека должна реализовать структуру, и пользователь должен определить интерфейс в этой структуре, передав ее при использовании dep инъекции. Что, указывает на первое решение, которое вы упомянули в своем посте! – user2402831