1

My issue is, cannot create auto generated instance from the interface.

Here is my example:

public class SomeClass {
    public string TestName { get; set; }
}

// And then I call like this
var obj = new Fixture().Create<SomeClass>();

Concrete class is generated automatically and it's properties like this:

Console.WriteLine(obj.TestName);
// Output: TestNameb7c3f872-9286-419f-bb0a-c4b0194b6bc8

But I have an interface like below:

public interface ISomeInterface 
{
    string TestName { get; set; }
}

// And  then I call like this
var obj = new Fixture().Create<ISomeInterface >();

It is generated but it's properties is not set.

Console.WriteLine(obj.TestName);
// Output: null

How can I create an instance from the interface like the concrete class?

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
hakanaltindis
  • 99
  • 1
  • 11

1 Answers1

2

Agree with Mathew Watson comment, this question might already be answered in the mentioned question.

Just wanted to share my version which is slightly different from those answer from 2012 ;)

public interface ISomeInterface
{
    string TestName { get; set; }
}

public class SomeClass : ISomeInterface
{
    public string TestName { get; set; }
}

public class Test
{
    [Fact]
    public void Do()
    {
        var fixture = new Fixture();
        fixture.Customize<ISomeInterface>(x => x.FromFactory(() => new SomeClass()));
        var result = fixture.Create<ISomeInterface>();
        Console.Out.WriteLine("result = {0}", result.TestName);
        // output:
        // result = TestName2c7e6902-d959-46ce-a79f-bf933bcb5b7f
    }
}

Of course, AutoMoq or AutoNSubstitute are the options to consider.

Serhii Shushliapin
  • 2,528
  • 2
  • 15
  • 32