Question

J'ai récemment commencé à utiliser AutoFixture+AutoMoq et je suis en train de créer une instance de Func<IDbConnection> (c'est à dire, une usine de raccordement).

var fixture = new Fixture().Customize(new AutoMoqCustomization());
var connectionFactory = fixture.Create<Func<IDbConnection>>();

Cela semble fonctionner plutôt bien:

  1. Mon système sous test peut appeler le délégué et il obtiendra une maquette de IDbConnection
  2. Sur qui je peux appeler CreateCommand, qui va me faire une maquette de IDbCommand
  3. Sur qui je peux appeler ExecuteReader, qui va me faire une maquette de IDataReader

J'ai maintenant envie de réaliser d'autres configurations sur la maquette de IDataReader, comme make it retour true lorsque Read() est appelé.

De ce que j'ai lu, je devrais être à l'aide de Freeze pour cela:

var dataReaderMock = fixture.Freeze<Mock<IDataReader>>();

dataReaderMock.Setup(dr => dr.Read())
                      .Returns(true);

Cela ne semble pas répondre à mes attentes.Quand je l'appelle IDbCommand.ExecuteReader, Je vais prendre un autre lecteur que celui que j'ai juste a gelé/de l'installation.

Voici un exemple:

var fixture = new Fixture().Customize(new AutoMoqCustomization());

var dataReaderMock = fixture.Freeze<Mock<IDataReader>>();
dataReaderMock.Setup(dr => dr.Read())
              .Returns(true);

//true - Create<IDataReader> retrieves the data reader I just mocked
Assert.AreSame(dataReaderMock.Object, fixture.Create<IDataReader>());

//false - IDbCommand returns a different instance of IDataReader
Assert.AreSame(dataReaderMock.Object, fixture.Create<IDbCommand>().ExecuteReader());

Ce que je fais mal?Comment puis-je obtenir autres appareils, tels que IDbCommand, l'utilisation de la moqué d'instance de IDataReader?

Était-ce utile?

La solution

Comme de 3.20.0, vous pouvez utiliser AutoConfiguredMoqCustomization.Cela permettra de configurer automatiquement tous les objets fantaisie, de sorte que leurs membres les valeurs de retour sont générés par AutoFixture.

E. g., IDbConnetion.CreateCommand sera automatiquement configuré pour renvoyer un IDbCommand de l'appareil, et IDbCommand.ExecuteReader sera automatiquement configuré pour renvoyer un IDataReader à partir de l'appareil.

Tous ces tests doivent passer maintenant:

var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());

var dataReaderMock = fixture.Freeze<Mock<IDataReader>>();
dataReaderMock.Setup(dr => dr.Read())
              .Returns(true);

//all pass
Assert.Same(dataReaderMock.Object, fixture.Create<IDataReader>());
Assert.Same(dataReaderMock.Object, fixture.Create<IDbCommand>().ExecuteReader());
Assert.Same(dataReaderMock.Object, fixture.Create<IDbConnection>().CreateCommand().ExecuteReader());
Assert.Same(dataReaderMock.Object, fixture.Create<Func<IDbConnection>>()().CreateCommand().ExecuteReader());

Autres conseils

Vous devez Freeze l' Mock<IDbCommand> ainsi – et de l'installation de la maquette de l'objet (comme un Tampon) pour revenir à l'existant dataReaderMock.Object exemple.

Si vous ajoutez ce qui suit à l'Arrangement de la phase de tests, le test passe:

var dbCommandStub = 
    fixture
        .Freeze<Mock<IDbCommand>>()
        .Setup(x => x.ExecuteReader())
        .Returns(dataReaderMock.Object);

Tandis que la solution de Nikos fonctionne je ne voudrais pas je ne recommande pas moqueur ado.net.

À mon avis, de vos tests sera sans doute difficile à comprendre, à maintenir et ne vous donnera pas la confiance de vos tests devrait vous donner.

Je voudrais envisager de tester votre couche de données en allant tout le chemin à la base de données, même si elle est plus lente.

Je vous recommande de lire cet article sur les meilleures pratiques pour se moquant:http://codebetter.com/jeremymiller/2006/01/10/best-and-worst-practices-for-mock-objects/

Ne pas se moquer des autres:http://aspiringcraftsman.com/2012/04/01/tdd-best-practices-dont-mock-others/

Je ne connais pas votre situation exacte, mais de toute façon je voulais le partager.

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