Я пишу небольшую POC на ходу на работу, но я не могу понять методы насмешки.это то, что у меня есть ...
connect.go
package db
import (
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"strings"
_ "github.com/lib/pq"
)
type config map[string]interface{}
type DbConn struct {
db db
}
type db interface {
getConnectionStringFromConfig(file string) (connStr string, err error)
}
func NewDbConn(d db) *DbConn {
return &DbConn{db: d}
}
func getConnectionStringFromConfig(file string) (connStr string, err error) {
var c config
var bt []byte
if bt, err = ioutil.ReadFile(file); err != nil {
fmt.Printf("Error Reading config file: %v", err)
return
}
fmt.Println("Finish reading file. Going to construct a connection string")
if err = json.Unmarshal(bt, &c); err != nil {
fmt.Printf("Error unmarshalling config file: %v", err)
return
}
connStr = strings.TrimLeft(getConfigAsString(c), " ")
return
}
func getConfigAsString(c config) (connStr string) {
for k, v := range c {
connStr += strings.Join([]string{" " + k, v.(string)}, "=")
}
return
}
// Connect database connection
func (dbConn DbConn) Connect() (conn *sql.DB, err error) {
fmt.Println("Starting database connection...")
connStr, err := getConnectionStringFromConfig("path/to/conf.json")
if err != nil {
return
}
conn, err = sql.Open("some_driver", connStr)
return
}
connect_test.go
package db
import (
"errors"
"testing"
)
type dbConnMock struct {
db dbMock
}
type dbMock interface {
getConnectionStringFromConfig(file string) (connStr string, err error)
}
func (dbm dbConnMock) getConnectionStringFromConfig(file string) (connStr string, err error) {
return "", errors.New("123")
}
// should not throw error when trying to open db connection
func TestDatabaseConnection(t *testing.T) {
dbCon := &DbConn{}
_, err := dbCon.Connect()
if err != nil {
t.Errorf("test failed. \n %d", err)
}
}
func TestDatabaseConnectionFail(t *testing.T) {
var dm dbMock
dbCon := NewDbConn(dm)
_, err := dbCon.Connect()
if err == nil {
t.Errorf("test failed. %d", err)
}
}
Как видите, это простая логика подключения к базе данных, которую я тестирую и проверяю с помощью интерфейса.Я хочу охватить 100% кода, поэтому мне приходится издеваться над определенными методами.Приведенный выше код, хотя и работает, второй тест не пройден, возможно, из-за того, что я что-то упустил в своих попытках издеваться над ним.Пожалуйста, помогите ..