将Moq与Windsor一起使用 - Moq.Mock类型的对象[IFoo]无法转换为IFoo

时间:2010-06-28 15:57:47

标签: nunit castle-windsor moq

我正在尝试建立一些Moq存储库来测试我的服务,并将Castle Windsor作为我的IOC。 Mu服务依赖于IFoo,所以我创建了一个实现IFoo的moq实例并将其注入容器中,如下所示:

_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 个答案:

答案 0 :(得分:12)

您应该传递mockUserRepository.Object而不是mockUserRepository

如果您使用强类型API,这将更加明显:

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

这是编译,因为Object属性实现了IUserRepository。

答案 1 :(得分:1)

我和温莎城堡面临同样的问题。 使用方法进行dinamyc初始化:

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

在我从我的caslteRepository.config文件中删除预先初始化的存储库(比如你的IUserRepository)并从存储库中保留容器“空”之后才能工作。