2016-07-14 9 views
1

ich habe folgendes Problem in Bezug auf AutoFixture istVerwenden erstellt ein AutoFixture Mock in einer konkreten Implementierung

public SUT(IConcrete concrete) 
{ 
    DTO BuildDTO() 
    { 
     return new DTO 
     { 
      URL = concrete.GetString(arg1, arg2); 
     }; 
    } 
} 

public Concrete : IConcrete 
{ 
    public Concrete(ISomeHandler someHandler) 
    { 
     ... 
    } 

    public GetString(obj arg1, obj arg2) 
    { 
     return someHandler.GetUri(arg1, arg2); 
    } 
} 

public void Test(
[Frozen] Mock<ISomeHandler> someHandler, 
SUT mySUT) 
{ 
    someHandler.Setup(...); 
    mySUT.DoStuff(); 
    //assert everything went as expected 
} 

Mein Problem in Code einfach erklärt, wie melde ich mich an die IConcrete mit AutoFixture, so dass ich auf den eingefrorenen Mock zugreifen kann, der im Testfall in ihn eingefügt werden soll?

In Wirklichkeit geht es darum, eine HttpRequestMessage in einen URL-Resolver zu injizieren, der in einem Handler vom Controller in einem Web-API-Projekt aufgerufen wird.

ich versucht habe, die IConcrete mit einem autofixture erstellt Mock

fixture.Register<IConcrete>(new Mock<ISomeHandler>()); 

zu registrieren, aber dann zugreifen kann ich nicht diesen Mock in dem Unit-Test und Inbetriebnahme des Rückgabewert.

Vielen Dank im Voraus für irgendwelche und alle Hilfe :)

+0

Wenn 'SUT' auf' IConcrete' abhängig ist, warum dann auch kümmern uns um 'ISomeHandler'? –

+0

Ich interessiere mich für den ISomeHandler, weil es eine URL ausgibt und ich möchte überprüfen, ob dies korrekt generiert wird. –

+0

In dem bereitgestellten Code gibt es keine Interaktion zwischen 'SUT' und' ISomeHandler'. –

Antwort

3

Um aktiviert werden AutoFixture Erzeugung Mocks die AutoMocking Container Bedürfnisse zu ermöglichen.

Sie müssen folgendes tun:

  1. Erstellen der AutoMoqAttribute:

    public class AutoMoqDataAttribute : AutoDataAttribute 
    { 
        public AutoMoqDataAttribute() 
        : base(new Fixture().Customize(new AutoMoqCustomization())) 
        { 
        } 
    } 
    
  2. Schmücken Sie Ihren Test mit dem neuen Attribut:

    [Theory, AutoMoqData] 
    public void Test(
        [Frozen] Mock<ISomeHandler> someHandler, 
        Sut sut) 
    { 
        someHandler.Setup(s => s.DoStuff()).Returns("123"); 
        Assert.Equal("123", sut.SomeHandler.DoStuff()); 
    } 
    

Wo Sut und ISomeHandler sind die folgenden:

public class Sut 
{ 
    public Sut(ISomeHandler someHandler) 
    { 
    SomeHandler = someHandler; 
    } 

    public ISomeHandler SomeHandler { get; } 
} 

public interface ISomeHandler 
{ 
    string DoStuff(); 
}