1
votes

Comment se moquer d'une commande ping

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?


1 commentaires

Une option consiste à créer un dépôt go-sqlmock et à ajouter ExpectPing vous-même.


3 Réponses :


4
votes

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


0 commentaires

1
votes

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.


1 commentaires

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



0
votes

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


0 commentaires