1
votes

Comment recevoir plusieurs valeurs renvoyées par une méthode dans la méthode "assert" du framework testify en tant qu'argument?

Voici un exemple de code, qui renvoie plusieurs valeurs.

assert.Equal(t,[nil,nil],testObject.CreateTenantHandler(nil) );

Dans le fichier de test, j'ai essayé de faire les choses ci-dessous.

func (c Calc) CreateTenantHandler(item *models.TenantInput) (*models.Response, *models.ErrorDetails) {

        ...
        ...
        ...

        return &models.Response{ResponseStatus: 201, TenantOutput: tenantoutput,}, nil

    }

J'ai également vérifié d'autres réponses mais je n'ai pas trouvé ce dont j'avais besoin.


0 commentaires

4 Réponses :


3
votes

Vous ne le faites pas. Cela n'a rien à voir avec le témoignage - c'est ainsi que fonctionne Go. Définissez plusieurs variables sur les valeurs de retour, puis affirmez chacune d'elles individuellement:

x, y := testObject.CreateTenantHandler(nil)
assertEqual(t, x, expectedX)
assertEqual(t, y, expectedY)


0 commentaires

0
votes

vous pouvez ajouter une fonction de conversion pour le corriger

package multi_return

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

func multiReturn() (int, float32) {
    return 1, 2
}

func toSlice(a ...interface{}) []interface{} {
    return a
}

func TestMultiReturn(t *testing.T) {
    assert.Equal(t, []interface{}{int(1), float32(2)}, toSlice(multiReturn()))
}


1 commentaires

Je suppose que cela fonctionnerait, mais cela masque l'origine de toute erreur.



0
votes

Une façon simple de faire ce que vous voulez est de déclarer une fonction comme shim:

  assert.Equal(t, shim(5,6), shim(testObject.CreateTenantHandler(nil)));

puis:

  func shim(a, b interface{}) []interface{} {
      return []interface{}{a, b}
  }


0 commentaires

1
votes

Le problème est que vous souhaitez convertir plusieurs valeurs de retour en une seule valeur utilisable par assert.Equal.

Vous pouvez le faire en passant plusieurs valeurs à une fonction variadique qui convertit toutes les valeurs (peu importe combien) en une seule tranche d'interfaces. Cette tranche est alors traitée comme une valeur unique et fonctionne assez bien avec testify assert.Equal.

La fonction shim mentionnée ailleurs est proche, mais elle a un nombre fixe de paramètres. makeIS () ci-dessous est moins de code, plus propre, plus simple et fonctionne avec n'importe quel nombre de valeurs / paramètres de retour. Mettez cette fonction dans votre package de test.

    assert.Equal(t, makeIS(eX,eY), makeIS(iReturnTwoValues())

Maintenant l'assert fonctionne comme ceci

    // makeIS will convert any number of parameters to a []interface{}
    func makeIS(v ...interface{}) []interface{} {
        return v
    }

Le testify sait comment faire la comparaison et rapporte très bien les différences dans les paramètres individuels. Notez que cela présente l'avantage supplémentaire de "ressembler à" l'appel que vous souhaitez tester avec les deux valeurs cibles à gauche de la fonction.


0 commentaires