AutoMoqer: parameters doorgeven aan constructeurs

Wanneer ik behoefte heb aan het bespotten van een les die zo gaat:

public class Dummy
{
  private readonly int _someInt;
  private readonly int _someOtherInt;
  private readonly IFoo _foo;

    public Dummy(int someInt,int someOtherInt, IFoo foo)
    {
      _someInt = someInt;
      _someOtherInt = someOtherInt;
      _foo = foo;
    }
}

Ik gebruik Moq om zoiets als dit te doen:

[Test]
public void ShouldCreateADummyInstance()
{
      var someInt = 1;
      var someOtherInt = 2;

      var mockFoo = new Mock();

      var dummy = new Dummy(someInt, someOtherInt, mockFoo.Object);

      //And so on...
}

Maar als ik AutoMoq gebruik, kan ik niet voor elke afhankelijkheid een andere int specificeren (I mean someInt en someOtherInt) in mijn constructor omdat AutoMoqer.SetInstace (instanceIWantToUse) dezelfde specifieke instantie instelt telkens wanneer die dependency moet leveren.

Weet je hoe kan ik een andere int specificeren voor someInt en someOtherInt om de AutoMoqer in mijn tests te blijven gebruiken?

Bedankt, ik hoop dat je me kunt helpen!

4

2 antwoord

Volledige ontsluiting: ik heb nog nooit AutoMoq gebruikt (hoewel ik me net heb aangemeld om het op GitHub te volgen omdat het er intrigerend uitziet en ik hou van dingen die op boilerplate verminderen).

Dat gezegd hebbende, lijkt het alsof de AutoMoq-tool voor een ander gebruik is ontworpen dan de jouwe. Het lijkt erop dat hij het gebruikt om 'toekomstbestendig' te zijn tegen doorbroken eenheidstests als een andere afhankelijke afhankelijke constructor is toegevoegd en om een ​​standaardobject te kunnen genereren met iets daar voor de afhankelijkheden, vermoedelijk om nulreferentie-uitzonderingen te voorkomen.

Ik zou na het lezen van de AutoMoq-projectpagina aannemen dat als Darren jouw specifieke unit test zou schrijven, hij waarschijnlijk Moq out of the box zou gebruiken. Dat wil zeggen, voor die specifieke test , je zou waarschijnlijk moeten gaan met de test die je hebt gepost. AutoMoq lijkt gericht te zijn op het leveren van verstandig standaardgedrag voor wanneer u niet de moeite wilt nemen om al uw afhankelijkheden in een test op te geven. Maar in uw geval wilt u doen die specifieke afhankelijkheden opgeven.

Alleen omdat u reguliere Moq voor die specifieke test gebruikt, betekent dit niet dat u AutoMoq niet voor andere tests kunt gebruiken. De rest van je tests (waarbij beide ints nul zijn of wat dan ook) zal toekomstbestendig zijn, maar misschien moet je gewoon leven met die ene breking als je een andere constructorparameter toevoegt aan je Dummy-klasse.

(U kunt ook altijd de broncode voor AutoMoq blokkeren en deze aan uw behoeften aanpassen).

2
toegevoegd
Ik denk dat je gelijk hebt, maar ik heb een reeks klassen afgeleid van een basissamenvattingklasse die constructeurs hebben met afhankelijkheden als deze. Ik zie dat ik in staat ben om de Unity-container te maken die AutoMoqer zal gebruiken, dus ik vraag me af of ik kan specificeren om een ​​objectwaarde te injecteren naar een afhankelijkheid die op een bepaalde manier is genoemd. Ik bedoel, wanneer ik een afhankelijkheid heb met de naam "myInt", injecteer 3, dus elke "myInt" met de naam dependcy zal bijvoorbeeld worden voorzien van een 3.
toegevoegd de auteur Pato, de bron

Oplossing vergelijkbaar met Moq

Je kunt een instantie van Dummy in AutoMoq heel gelijkaardig maken als in Moq. Dit bewijst uw testcode niet toekomstbestendig tegen wijzigingen in de constructorfarameters, maar kan nog steeds acceptabel zijn.

var mocker = new AutoMoqer();
var fooMock = mocker.GetMock();
var dummy = new Dummy(1, 2, fooMock.Object);
// test something about dummy

Oplossing met AutoMoq

Als u uw TestCode echt toekomstbestendig wilt maken, dan is het misschien nodig om de constructor te veranderen om afhankelijk te zijn van interfaces.

interface IDummyParameters {
    int SomeInt {get;set;}
    int SomeOtherInt {get;set;}
}

public class Dummy {
    public Dummy(IDummyParameters parameters, IFoo foo){
        ...
    }
}

Dan kunt u uw Dummy-klasse met AutoMoq als volgt maken:

var mocker = new AutoMoqer();
mocker.GetMock.Setup(x => x.SomeInt).Returns(1);
mocker.GetMock.Setup(x => x.SomeOtherInt).Returns(2);
// notice how this code does not say anything about IFoo.
// It is created automatically by AutoMoq
var dummy = mocker.Create();
0
toegevoegd