9

私はそのようなクラスを持っています:

public class ViewModel
{
    public IPagination<Data> List { get; set; } // interface!
    public SearchFilter SearchFilter { get; set; }
    public string Test { get; set; }
}

public class SearchFilter
{
    public string Name { get; set; }
}

IPaginationインターフェイスの周囲に動的プロキシを作成し、プロキシにテストデータを入力する必要があります。AutoFixtureにViewModelタイプのインスタンスを作成させることは可能ですか?私は実行時にタイプしか知らないことに注意してください(typeof(ViewModel))。

今では私はこれを行うことができることを知っています:

var context = new SpecimenContext(fixture.Compose());
var value = context.Resolve(new SeededRequest(typeof(ViewModel), null))
4

2 に答える 2

5

簡単な可能性は、ファクトリメソッドを登録することです。

fixture.Register<YourInterface>(() =>  new InterfaceImpl());

AutoFixtureが、自動モックのカスタマイズの1つを使用するインターフェイスのプロキシを自動的に作成できるようにするには、次のようにします。

  • AutoMoqCustomization
  • AutoRhinoMockCustomization
  • AutoFakeItEasyCustomization

具体的なケースでは、これにより、空のリストを表すインターフェイスのインスタンスが作成されます。
そのリストにテストデータを含めたい場合は、自動モッキングのカスタマイズではなく、このブログ投稿でIPagination説明されているようにのセマンティクスを理解するカスタマイズを使用する必要があります。 それが複雑すぎる場合でも、次の方法を使用できます。
Register

fixture.Register(() => (IPagination<Data>)new Pagination(
                                            fixture.CreateMany<Data>()));
于 2012-10-18T07:49:24.583 に答える
4

理論的には、自動モックされたインスタンスのプロパティを埋めることができるはずです。

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、AutoMoqAutoRhinoMocksAutoFakeItEasy、または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;
        }
    }
}
于 2012-10-18T15:31:19.337 に答える