【问题标题】:Using Moq with Windsor -- Object of Type Moq.Mock[IFoo] cannot be converted to IFoo将 Moq 与 Windsor 一起使用 - Moq.Mock[IFoo] 类型的对象无法转换为 IFoo
【发布时间】:2011-06-03 23:48:33
【问题描述】:

我正在尝试设置一些最小起订量存储库来测试我的服务,将温莎城堡作为我的 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”类型

谁能看出我做错了什么?

【问题讨论】:

    标签: nunit castle-windsor moq


    【解决方案1】:

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

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

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

    因为 Object 属性实现了 IUserRepository,所以可以编译。

    【讨论】:

      【解决方案2】:

      我在温莎城堡遇到同样的问题。 一个带有方法的 dinamyc 初始化:

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

      直到我从我的 caslteRepository.config 文件中删除了预初始化的存储库(例如您的 IUserRepository)并从存储库中将容器“空”了之后才起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多