J'utilise https://github.com/DATA-DOG/go-sqlmock et en essayant de simuler une connexion à une base de données.
Maintenant, je dois me moquer d'une commande ping (à des fins d'équilibrage de charge). Cependant, je ne trouve aucune information sur la façon de procéder.
Par exemple, je voudrais écrire un test comme celui-ci
db, mock, _ := sqlmock.New() // ExpectPing does not exist, but it is there anything similar? mock.ExpectPing().WillReturnError("mock error") err := db.Ping() if err==nil{ t.Fatal("there should have been an error") }
en plus, j'ai besoin d'injecter cet objet simulé dans une fonction. disons New (* sql.DB) qui génère une nouvelle structure. il doit donc être compatible avec la structure * sql.DB. pour cette raison, sqlmock semble un bon choix. Cependant, je n'ai pas trouvé le moyen de me moquer de la commande ping.
y a-t-il un moyen de le faire en utilisant cette bibliothèque? sinon, existe-t-il une autre bibliothèque simulée de base de données / sql qui pourrait faire l'affaire?
3 Réponses :
Mise à jour: Depuis le 6 janvier 2020, cette fonctionnalité a été ajouté à go-sqlmock
et est inclus dans le version v1.4.0 .
Réponse originale:
Non, il n'y a «rien de similaire». Les méthodes Ping
et PingContext
dépendent du pilote implémentant le Pinger
interface, vous ne pouvez donc pas l'imiter en vous attendant, par exemple, à un 'SELECT 1' ou quelque chose.
Il y a déjà un problème demandant l'ajout de ceci. Cela ne semble pas avoir beaucoup retenu l'attention. Je soupçonne que la création d'un PR (qui est probablement d'environ 3 lignes de code) augmenterait considérablement les chances d'avoir cette fonctionnalité ajoutée.
Si votre objectif est de faire échouer un ping, vous devriez être en mesure de l'imiter en vous connectant à un point de terminaison de base de données non valide (avec ou sans sqlmock).
Vous pouvez certainement vous moquer de db
lui-même:
type mockedDB struct { *sql.DB } func (db *mockedDB) Ping() error { return errors.New("not implemented") } func Example_mockedDB_Ping() { db, _, _ := sqlmock.New() defer db.Close() mdb := mockedDB{db} fmt.Println("mdb.Ping(): ", mdb.Ping()) // Output: mdb.Ping(): not implemented }
mais je ne comprends pas à quoi sert une telle expérience.
Dans de la même manière que vous pouvez mettre mock
dans un nouveau type et définir ExpectPing
dessus.
Bonne réponse. Mais j'ai besoin d'injecter cet objet simulé dans un autre objet via une fonction ex: New (* sql.DB). qui n'accepte que les types * sql.DB. donc ce genre d'idée fictive ne s'applique pas. J'ai mis à jour ma question en conséquence
J'avais également besoin de me moquer de la fonctionnalité Ping (). Voici comment je l'ai résolu:
type mockDB struct { ReturnError error } func (db *mockDB) Ping() error { return db.ReturnError } func (db *mockDB) PingContext(ctx context.Context) error { return db.ReturnError } // Pinger to be able to mock & ask just for a ping type Pinger interface { PingContext(ctx context.Context) error Ping() error } // DatabasePingCheck returns a Check that validates connectivity to a database/sql.DB using Ping(). func DatabasePingCheck(pinger Pinger, timeout time.Duration) Check { return func() error { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() if pinger == nil { return fmt.Errorf("pinger is nil") } return pinger.PingContext(ctx) } }
Une option consiste à créer un dépôt
go-sqlmock
et à ajouterExpectPing
vous-même.