2015-08-18 20 views
6

Jak zmusić AutoFixture do skonfigurowania za pomocą AutoConfiguredMoqCustomization automatycznie kpić interfejsy i jego właściwości tylko do odczytu?AutoConfiguredMoqCustomizacja i właściwości nieustalone

Żeby było jasne, załóżmy mam taki interfejs:

public interface A { 
    int Property {get;} 
} 

i taką klasę:

public class SomeClass { 
    public SomeClass(A dependency) {} 
} 

Co ja ma mieć dependency postanowił mock że powróci coś w dependency.Property:

var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization()); 
var sut = fixture.Create<SomeClass>(); // <- dependency passed to SomeClass' constructor will have .Property returning null 
+1

mogę odtworzyć to tylko z najnowszą wersją Min - spróbuj zainstalować wersję '4.1.1308.2120 zamiast tego: 'install-package Moq -version 4.1.1308.2120'. – dcastro

Odpowiedz

5

Jest to spowodowane błędem i wprowadzone w Moq 4.2.1502.911, gdzie SetupAllProperties przesłania poprzednie ustawienia wykonane dla właściwości tylko do pobrania.

Oto prostsze repro:

public interface Interface 
{ 
    string Property { get; } 
} 

var a = new Mock<Interface>(); 

a.Setup(x => x.Property).Returns("test"); 
a.SetupAllProperties(); 

Assert.NotNull(a.Object.Property); 

Jest to rodzaj co robi AutoFixture za kulisami, aby utworzyć wystąpienie Interface. Ten test kończy się niepowodzeniem z wersjami Moq równymi lub większymi niż 4.2.1502.911, ale przechodzi w niższych wersjach.

Wystarczy uruchomić to na konsoli Menedżer pakietów:

install-package Moq -version 4.2.1409.1722 

Ten błąd jest śledzone są tutaj: https://github.com/Moq/moq4/issues/196

+1

+1 Warto wspomnieć, że śledzimy również problem w samej AutoFixture: https://github.com/AutoFixture/AutoFixture/issues/434 –

+0

Dzięki za pomoc. Nie miałem czasu, aby wypróbować twoje obejście jeszcze. Zmieniłem właściwości, które można było ustawić, i wszystko działało dobrze. – SOReader

Powiązane problemy