Тестирование AutoMapper и внедрение зависимостей для распознавателей - PullRequest
5 голосов
/ 27 мая 2011

Я пишу тест для карты автомата.Для одного из целевых элементов на карте требуется преобразователь значений, и этот преобразователь значений имеет служебные зависимости, которые вводятся.Я хочу использовать реальную реализацию для резольвера (так как это часть карты, которую я тестирую), но я бы хотел использовать макеты для зависимостей, которые есть у резольвера.в моих тестах, но как мне легко разрешить зависимости моего преобразователя значений без такового?

Это мой довольно упрощенный пример, в реальном случае есть несколько преобразователей с иногда многими зависимостями, и я действительно не хочув основном реализую свой собственный преобразователь зависимостей в моих тестах.Должен ли я использовать легкий контейнер IOC?

        [TestFixture]
        public class MapperTest
        {
            private IMyService myService;

            [SetUp]
            public void Setup()
            {
                Mapper.Initialize(config =>
                                    {
                                    config.ConstructServicesUsing(Resolve);
                                    config.AddProfile<MyProfile>();
                                    });
            }

            public T Resolve<T>()
            {
                return (T) Resolve(typeof (T));
            }

            public object Resolve(Type type)
            {
                if (type == typeof(MyValueResolver))
                    return new MyValueResolver(Resolve<IMyService>());
                if (type == typeof(IMyService))
                    return myService;
                Assert.Fail("Can not resolve type " + type.AssemblyQualifiedName);
                return null;
            }

            [Test]
            public void ShouldConfigureCorrectly()
            {
                Mapper.AssertConfigurationIsValid();
            }

            [Test]
            public void ShouldMapStuff()
            {
                var source = new Source() {...};
                var child = new Child();
                myService = MockRepository.GenerateMock<IMyService>();

                myService .Stub(x => x.DoServiceStuff(source)).Return(child);

                var result = Mapper.Map<ISource, Destination>(source);

                result.Should().Not.Be.Null();
                result.Child.Should().Be.SameInstanceAs(child);
            }

        }


        public class MyProfile : Profile
        {

            protected override void Configure()
            {
                base.Configure();

                CreateMap<ISource, Destination>()
                    .ForMember(m => m.Child, c => c.ResolveUsing<MyResolver>());

            }

       }

       public class MyResolver: ValueResolver<ISource, Destination>
        {
            private readonly IMyService _myService;

            public MyResolver(IMyService myService)
            {
                _myService = myService;
            }

            protected override Child ResolveCore(ISource source)
            {
                             return _myService.DoServiceStuff(source);
            }
        }
    }

1 Ответ

1 голос
/ 27 мая 2011

Вот одно решение, но в основном это то, что я уже сделал:

http://groups.google.com/group/automapper-users/browse_thread/thread/aea8bbe32b1f590a/f3185d30322d8109

Предлагается использовать указатель службы, который настраивается по-разному в зависимости от теста или реальной реализации.

...