À l'aide de Vérifier pour confirmer attendu des valeurs de paramètre dans Moq classe fantaisie

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

  •  29-10-2019
  •  | 
  •  

Question

Je suis en train de vérifier qu'une méthode à l'intérieur d'une maquette est appelée avec un paramètre de l'objet.Je suis l'aide de Moq, nUnit, et de penser que AutoFixture image devrait faire le travail.Ci-dessous est une version simplifiée de ce que je suis en train de faire.

Est-il un moyen de le faire avec AutoFixture?Est-il un meilleur moyen de vérifier que Something est appelée avec le paramètre approprié?

Primordial est Égal à dans la A classe afin de comparer les valeurs de propriété et la modification de la Verify ligne:

barMock.Verify(m => m.Something(a));

passe, cependant, je préfère ne pas remplacer égal à Égal, dans chaque classe, comme dans mon projet.

namespace Test
{
    using Moq;
    using NUnit.Framework;
    using Ploeh.SemanticComparison.Fluent;

    public class A
    {
        public int P1 { get; set; }
    }
    public interface IBar
    {
        void Something(A a);
    }

    public class Foo
    {
        public A Data { get; private set; }
        public void DoSomethingWith(IBar bar)
        {
            Data = new A { P1 = 1 };
            bar.Something(Data);
        }
    }

    [TestFixture]
    public class AutoFixtureTest
    {
        [Test]
        public void TestSample()
        {
            var foo = new Foo();
            var barMock = new Mock<IBar>();
            var a = new A { P1 = 1 };
            var expectedA = a.AsSource().OfLikeness<A>();

            foo.DoSomethingWith(barMock.Object);

            expectedA.ShouldEqual(foo.Data);   // passes
            barMock.Verify(m => m.Something(expectedA.Value));  // fails
        }
    }
}
Était-ce utile?

La solution

Dans le Verify Moq par défaut des contrôles de référence de l'égalité pour les arguments, donc il ne passe lorsque vous fournissez le même cas (sauf si vous avez changé Equals) dans vos tests et de la mise en œuvre.

Dans votre cas la expectedA.Value retourne le new A { P1 = 1 } créé dans le test qui est bien sûr, n'est pas la même instance créée en DoSomethingWith.

Vous avez besoin d'utiliser Moq est It.Is construire pour tester correctement ce sans écraser Equals (en fait, pour cela, vous n'avez pas besoin Autofixture à tous):

barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1)));

Mais si vous avez plusieurs propriétés comme la P1,P2,P3...AutoFixture peut être utile:

barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a))));

Parce que vous n'avez pas besoin d'écrire le eqaulity vérifie manuellement pour toutes les propriétés.

Autres conseils

Si vous mettez à niveau vers AutoFixture 2.9.1 (ou plus récent), vous pouvez appeler la méthode CreateProxy sur l'instance Likeness qui émettra un proxy dynamique pour le type de destination.

Le proxy dynamique généré remplace Equals en utilisant la ressemblance, ce qui simplifie la syntaxe (beaucoup).

Voici la méthode de test originale, modifiée pour utiliser le proxy de ressemblance:

[Test]
public void TestSample()
{
    var foo = new Foo();
    var barMock = new Mock<IBar>();
    var expected = new A().AsSource().OfLikeness<A>().CreateProxy();
    expected.P1 = 1;

    foo.DoSomethingWith(barMock.Object);

    Assert.True(expected.Equals(foo.Data));     // passes
    barMock.Verify(m => m.Something(expected)); // passes
}

Notez que cela rend également l'assertion de test beaucoup plus spécifique que d'accepter N'importe quelle instance.

Vous pouvez trouver plus de détails sur cette nouvelle fonctionnalité ici .

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