Это на самом деле возможно сделать с автофиксом, но это требует небольшой настройки.Точки расширяемости все есть, но я допускаю, что в этом случае решение не особенно доступно для обнаружения.
Это становится еще сложнее, если вы хотите, чтобы оно работало с вложенными / сложными типами.
Учитывая приведенный выше класс MyObject
, а также класс MyParent
:
public class MyParent
{
public MyObject Object { get; set; }
public string Text { get; set; }
}
, все эти модульные тесты проходят:
public class Scenario
{
[Fact]
public void CreateMyObject()
{
var fixture = new Fixture().Customize(new MockHybridCustomization());
var actual = fixture.CreateAnonymous<MyObject>();
Assert.NotNull(actual.A);
Assert.NotNull(actual.B);
Assert.NotNull(actual.C);
}
[Fact]
public void MyObjectIsMock()
{
var fixture = new Fixture().Customize(new MockHybridCustomization());
var actual = fixture.CreateAnonymous<MyObject>();
Assert.NotNull(Mock.Get(actual));
}
[Fact]
public void CreateMyParent()
{
var fixture = new Fixture().Customize(new MockHybridCustomization());
var actual = fixture.CreateAnonymous<MyParent>();
Assert.NotNull(actual.Object);
Assert.NotNull(actual.Text);
Assert.NotNull(Mock.Get(actual.Object));
}
[Fact]
public void MyParentIsMock()
{
var fixture = new Fixture().Customize(new MockHybridCustomization());
var actual = fixture.CreateAnonymous<MyParent>();
Assert.NotNull(Mock.Get(actual));
}
}
Что входит в MockHybridCustomization?Это:
public class MockHybridCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(
new MockPostprocessor(
new MethodInvoker(
new MockConstructorQuery())));
fixture.Customizations.Add(
new Postprocessor(
new MockRelay(t =>
t == typeof(MyObject) || t == typeof(MyParent)),
new AutoExceptMoqPropertiesCommand().Execute,
new AnyTypeSpecification()));
}
}
Классы MockPostprocessor
, MockConstructorQuery
и MockRelay
определены в расширении AutoMoq для AutoFixture, поэтому вам нужно добавить ссылку на этобиблиотека.Тем не менее, обратите внимание, что не требуется добавлять AutoMoqCustomization
.
. Класс AutoExceptMoqPropertiesCommand
также настраивается по этому случаю:
public class AutoExceptMoqPropertiesCommand : AutoPropertiesCommand<object>
{
public AutoExceptMoqPropertiesCommand()
: base(new NoInterceptorsSpecification())
{
}
protected override Type GetSpecimenType(object specimen)
{
return specimen.GetType();
}
private class NoInterceptorsSpecification : IRequestSpecification
{
public bool IsSatisfiedBy(object request)
{
var fi = request as FieldInfo;
if (fi != null)
{
if (fi.Name == "__interceptors")
return false;
}
return true;
}
}
}
Это решение предоставляет общее решение длявопрос.Тем не менее, он не был тщательно протестирован, поэтому я хотел бы получить отзыв об этом.