Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AutoConfiguredMoqCustomization and unsettable properties

How do I force AutoFixture, that has been configured with AutoConfiguredMoqCustomization, to automatically mock interfaces and its read-only properties?

To make things clear, let's assume I have such an interface:

public interface A {
     int Property {get;}
}

and such class:

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

What I want is to have dependency resolved to a mock that will return something in dependency.Property:

var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
var sut = fixture.Create<SomeClass>(); // <- dependency passed to SomeClass' constructor will have .Property returning null
like image 323
SOReader Avatar asked Aug 18 '15 08:08

SOReader


1 Answers

This is due to a bug introduced in Moq 4.2.1502.911, where SetupAllProperties overrides previous setups done on get-only properties.

Here's a simpler 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);

This is sort of what AutoFixture does behind the scenes to create an instance of Interface. This test fails with versions of Moq equal to or greater than 4.2.1502.911, but passes with lower versions.

Simply run this on the Package Manager Console:

install-package Moq -version 4.2.1409.1722

This bug is being tracked here: https://github.com/Moq/moq4/issues/196

like image 93
dcastro Avatar answered Nov 03 '22 13:11

dcastro