理論的には、自動モックされたインスタンスのプロパティを埋めることができるはずです。
IPagination<T>
タイプのプロパティが次のViewModel
ように定義されていると仮定します。
public interface IPagination<T>
{
SearchFilter Property1 { get; set; }
string Property2 { get; set; }
}
アドホックな自動モッキングのカスタマイズを作成できますMyCustomization
。
var fixture = new Fixture()
.Customize(new MyCustomization());
var context = new SpecimenContext(fixture.Compose());
次に、次の呼び出しにより、ViewModel
(実行時にのみ認識される)のインスタンスが作成され、の自動モックされたインスタンスが提供され、プロパティIPagination<Data>
に値が割り当てられます。
var value = context.Resolve(typeof(ViewModel));
// List -> {IPagination`1Proxy593314cf4c134c5193c0019045c05a80}
// List.Property1.Name -> "Namef71b8571-a1a0-421d-9211-5048c96d891b"
// List.Property2 -> "f58cae65-b704-43ec-b2ce-582a5e6177e6"
MyCustomization
このカスタマイズを適用する前に、これはこの特定のシナリオでのみ機能する必要があることに注意してください(したがって、説明ではアドホックです)。Auto Mocking、AutoMoq、AutoRhinoMocks、AutoFakeItEasy、またはAutoNSubstituteの拡張機能の1つを他の場所で使用することを強くお勧めします。
internal class MyCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(new MySpecimenBuilder());
}
private class MySpecimenBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var type = request as Type;
if (type == null || !type.IsInterface)
{
return new NoSpecimen(request);
}
object specimen = this
.GetType()
.GetMethod(
"Create",
BindingFlags.NonPublic | BindingFlags.Static)
.MakeGenericMethod(new[] { type })
.Invoke(this, new object[] { context });
return specimen;
}
private static object Create<TRequest>(ISpecimenContext context)
where TRequest : class
{
var mock = new Mock<TRequest>();
mock.SetupAllProperties();
foreach (PropertyInfo propInfo in typeof(TRequest).GetProperties())
{
object value = context.Resolve(propInfo.PropertyType);
propInfo.SetValue(mock.Object, value);
}
return mock.Object;
}
}
}