Moq: spécification des valeurs de retour dans le cadre des attentes

StackOverflow https://stackoverflow.com/questions/1436757

  •  08-07-2019
  •  | 
  •  

Question

Je suis nouveau sur Moq et j'apprends.

Je dois vérifier qu'une méthode renvoie la valeur attendue. J'ai mis en place un exemple de tête pour expliquer mon problème. Cela échoue lamentablement avec:

  

" ArgumentException: l'expression n'est pas une invocation de méthode: c = > (c. Quelque chose (& "; Jo &"; & "Blog &"; 1) = & "OK &";) & ";

Pouvez-vous corriger ce que je fais mal?

[TestFixtureAttribute, CategoryAttribute("Customer")]
public class Can_test_a_customer
{
    [TestAttribute]
    public void Can_do_something()
    {
        var customerMock = new Mock<ICustomer>();

        customerMock.Setup(c => c.DoSomething("Jo", "Blog", 1)).Returns("OK");

        customerMock.Verify(c => c.DoSomething("Jo", "Blog", 1)=="OK");
    }
}

public interface ICustomer
{
    string DoSomething(string name, string surname, int age);
}

public class Customer : ICustomer
{
    public string DoSomething(string name, string surname, int age)
    {
        return "OK";
    }
}

En résumé: si je voulais tester une méthode comme celle ci-dessus et que je sais que je m'attends à recevoir un & "OK &", comment puis-je l'écrire avec Moq?

Merci pour vos suggestions.

Était-ce utile?

La solution

  1. Vous avez besoin d'un sujet de test qui interagit avec des objets fictifs (sauf si vous écrivez un test d'apprenant pour Moq.) J'ai rédigé un test simple ci-dessous
  2. Vous configurez les attentes sur l'objet fictif, en spécifiant les arguments exacts (strict - si vous souhaitez bien sûr utiliser une autre option, utilisez Is.Any<string> pour accepter n'importe quelle chaîne) et indiquez des valeurs de retour, le cas échéant
  3. Votre sujet de test (dans le cadre de l'étape Act du test) appellera votre maquette
  4. Vous affirmez que le sujet de test s'est comporté comme il convient. La valeur renvoyée par les méthodes fictives sera utilisée par le sujet testé - vérifiez-la via l'interface publique du sujet testé.
  5. Vous vérifiez également que toutes les attentes que vous avez spécifiées ont été satisfaites - toutes les méthodes que vous espériez appeler ont en fait été appelées.

.

[TestFixture]
public class Can_test_a_customer
{
  [Test]
  public void Can_do_something()
  {
    //arrange
    var customerMock = new Moq.Mock<ICustomer>();
    customerMock.Setup(c => c.DoSomething( Moq.It.Is<string>(name => name == "Jo"),
         Moq.It.Is<string>(surname => surname == "Blog"),
         Moq.It.Is<int>(age => age == 1)))
       .Returns("OK");

    //act
    var result = TestSubject.QueryCustomer(customerMock.Object);

    //assert
    Assert.AreEqual("OK", result, "Should have got an 'OK' from the customer");
    customerMock.VerifyAll();
  }
}

class TestSubject
{
  public static string QueryCustomer(ICustomer customer)
  {
    return customer.DoSomething("Jo", "Blog", 1);
  }
}

Autres conseils

Mock<T>.Verify ne renvoie pas la valeur renvoyée par l'appel de la méthode. Vous ne pouvez donc pas simplement la comparer à la valeur attendue à l'aide de " == " ;.

En fait, il existe pas de surcharge de Verify renvoyant quoi que ce soit , car vous ne devriez jamais avoir besoin de vérifier qu’une méthode simulée renvoie une valeur spécifique. Après tout, vous avez été chargé de le configurer pour renvoyer cette valeur en premier lieu! Les valeurs de retour des méthodes simulées sont à utiliser par le code que vous testez - vous ne testez pas les simulacres.

Utilisez Vérifier pour confirmer que la méthode a été appelée avec les arguments que vous attendez ou qu'une propriété a été affectée à une valeur que vous attendiez. Les valeurs de retour des méthodes et des propriétés fictives ne sont plus importantes au moment où vous accédez à & "Assert &"; phase de votre test.

Vous faites la même chose que ce type faisait ici: Comment vérifier une autre méthode de la classe a été appelé avec Moq

Vous vous moquez de ce que vous testez. Cela n'a pas de sens. L'utilisation de Mock est pour l'isolement. Votre test Can_Do_Quelque chose sera toujours positif . Peu importe ce que. Ce n'est pas un bon test.

Examinez de plus près le test de Gishu ou le test que j'ai proposé dans la question liée à SO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top