Использование autofac с moq - PullRequest
11 голосов
/ 09 ноября 2011

Мне нужно зарегистрировать свой контейнер Autofac с определенным интерфейсом, для этого случая я хочу разрешить макет.

Как я могу это сделать?

Я пробовал:

var AppContainer = ApplicationContainer.GetApplicationContainer();  
var cb = new ContainerBuilder();
cb.RegisterType<Mock<IStudyLoader>>().As<IStudyLoader>().SingleInstance();
cb.Update(AppContainer);

Я не хочу менять свой код для разрешения чего-то другого, кроме IStudyLoader, но Mock<IStudyLoader> не может заменить IStudyLoader; например, Mock<IStudyLoader>.Object может заменить IStudyLoader, но я не могу зарегистрировать Mock<IStudyLoader>.Object, потому что это не тип.

Поправьте меня пожалуйста; У меня такое чувство, что я что-то упускаю.

(У меня есть другое ограничение, я не могу использовать другой контейнер, кроме ApplicationContainer.GetApplicationContainer())

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

Ответы [ 5 ]

17 голосов
/ 09 ноября 2011

Я нашел решение, Да, это возможно!

  var AppContainer = ApplicationContainer.GetApplicationContainer();
  var studyLoaderMock = new Mock<IStudyLoader>().Object;
  cb.RegisterInstance(studyLoaderMock).As<IStudyLoader>();
  cb.Update(AppContainer);
7 голосов
/ 09 ноября 2011

Метод, который вы ищете, называется RegisterInstance:

var mock = ...;
var cb = new ContainerBuilder();
cb.RegisterInstance(mock.Object);
var container = cb.Build();

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

«Обходной путь», которому я настоятельно рекомендую следовать, состоит в том, чтобы не привлекать AppContainer к вашему тесту, а создать контейнер, специально предназначенный для вашего теста, чтобы вы могли лучше контролировать то, что там происходит, а что нет. Эффект состоит в том, что вы получаете возможность зарегистрировать любой необходимый имитационный экземпляр вместе с SUT .

5 голосов
/ 28 января 2018

Старый вопрос, но AutoFac Теперь, начиная с версии 4.0.1, поддерживается Moq4 и предоставляется дополнительный пакет, который вы можете установить Autofac.Extras.Moq

    Install-Package Autofac.Extras.Moq

Autofac.Extras.Moq автоматически устанавливает AutoFac и Moq

Вам не нужно создавать Контейнер и регистрировать StudyLoader. Это неявно определяется Autofac.Extras.Moq.

Autofac.Extras.Moq полезен для вложенной зависимости. Вам не нужно регистрировать весь граф зависимостей. Только издевайтесь над объектом SystemUnderTest SUT

Вы можете реализовать свой тестовый пример, как указано ниже:

         [TestFixture]
        class StudyLoaderTest
        {
            [Test]
            public void Test()
            {
                using (var mock = AutoMock.GetLoose())
                {
                    // The AutoMock class will inject a mock IStudyLoader
                    // into the StudyLoader constructor
                    //no need to create/configure a container
                    var studyLoader = mock.Create<StudyLoader>();               
                    Assert.AreEqual("hi AutoFac Moq", studyLoader.Name);
                }
            }
        }

         class StudyLoader : IStudyLoader
        {
            public string Name { get; set; } = "hi AutoFac Moq";
        }
         interface IStudyLoader
        {
            string Name { get; set; }
        }
1 голос
/ 09 ноября 2011

У меня нет особого опыта работы с autofac, но большинство других контейнеров, с которыми я работал, позволяют зарегистрировать экземпляр объекта, который уже создан. Таким образом, вы можете создать свой макет, а затем зарегистрировать mock.Object как реализацию для IStudyLoader. Консультируйтесь с документацией autofac о том, как сделать это.

0 голосов
/ 10 декабря 2017

Поскольку этот вопрос был задан, теперь существует пакет AutoFac.Extras.Moq, поддерживаемый AutoFac:

http://autofaccn.readthedocs.io/en/latest/integration/moq.html

Это позволяет создавать на лету зависимостей в ваших юнит-тестах.

...