Использование Moq с Windsor - объект типа Moq.Mock [IFoo] нельзя преобразовать в IFoo - PullRequest
9 голосов
/ 28 июня 2010

Я пытаюсь настроить несколько репозиториев Moq для проверки моей службы с Castle Windsor в качестве моего IOC. Служба mu зависит от IFoo, поэтому я создаю экземпляр moq, который реализует IFoo, и внедряю его в контейнер следующим образом:

_container.AddComponent("AutoBill", 
  typeof (AutoBillService), typeof (AutoBillService));

var mockUserRepository = new Mock<IUserRepository>();
var testUser = new User()
   {
     FirstName = "TestFirst",
     LastName = "TestLast", 
     UID=1
   };
mockUserRepository.Setup(repo => repo.GetUser(testUser.UID))
   .Returns(testUser);

_container.Kernel.AddComponentInstance("UserRepository", 
   typeof(IUserRepository), mockUserRepository);

var service = _container.Resolve<AutoBillService>(); //FAIL

Это дает мне исключение: System.ArgumentException: объект типа 'Moq.Mock`1 [IUserRepository]' не может быть преобразован в тип 'IUserRepository'

Кто-нибудь может увидеть, что я делаю не так?

Ответы [ 2 ]

12 голосов
/ 28 июня 2010

Вы должны передать mockUserRepository.Object вместо mockUserRepository.

Это было бы намного более очевидно, если бы вы использовали строго типизированный API:

_container.Register(Component
    .For<IUserRepository>()
    .Instance(mockUserRepository.Object));

Это компилируется, потому что свойство Object реализует IUserRepository.

1 голос
/ 03 июня 2011

У меня такая же проблема с замком Виндзор. Инициализация динамического метода:

container.Register(Component.For<IUserRepository>()
         .Instance(mockUserRepository.Object));

не работало до тех пор, пока я не удалил из своего предварительно инициализированных репозиториев (например, IUserRepository) из моего файла caslteRepository.config и не оставил контейнер «пустым» из репозиториев.

...