我如何模拟我的通用Unity解析包装器?打电话很模糊

时间:2013-12-16 21:34:29

标签: c# unity-container moq

public T Resolve<T>() {
  return _container.Resolve<T>();
}

Mock<ServiceLocator> serviceLocator = new Mock<ServiceLocator>();
Mock<SecurityHelper> securityHelper= new Mock<SecurityHelper>();
serviceLocator.Setup(x => x.Resolve<SecurityHelper>()).Returns(securityHelper);

产生此错误,我该如何解决此问题?

  

错误36以下方法或之间的调用不明确   特性:   'Moq.Language.IReturns<MVCWebsite.Helpers.ServiceLocator,MVCWebsite.Helpers.SecurityHelper>.Returns(System.Func<MVCWebsite.Helpers.SecurityHelper>)'   和   'Moq.Language.IReturns<MVCWebsite.Helpers.ServiceLocator,MVCWebsite.Helpers.SecurityHelper>.Returns(MVCWebsite.Helpers.SecurityHelper)'C:\ dev \ Foundation \ Foundation.Test \ Fixtures \ Account \ AccountCtrlFixture.cs 61 13 Foundation.Test

编辑:(在接受谢尔盖的帮助后,以下是最终的解决方案)

[Test]
        public void TestResolveMockPoc()
        {
            //Mock service locator object
            Mock<ServiceLocator> serviceLocator = new Mock<ServiceLocator>();

            //Mock appSettings object
            Mock<AppSettings> appSettings = new Mock<AppSettings>();
            appSettings.Object.AppName = "IfYouSeeThisPocIsWorking";

            //Mock Resolve method to return my mocked object, for this particular type.
            serviceLocator.Setup(x => x.Resolve<AppSettings>()).Returns(appSettings.Object);

            //Override ServiceLocator inside the ServiceLocator helper (this is what is called by actual project)
            ServiceLocator.Locator = serviceLocator.Object;

            //Assert if this Moq Poc worked :-) ;)
            string updatedAppName = ServiceLocator.AppSettings().AppName;
            Assert.AreEqual(ServiceLocator.AppSettings().AppName, "IfYouSeeThisPocIsWorking");


        }

2 个答案:

答案 0 :(得分:3)

我认为你需要做的是返回与你的Mock SecurityHelper相关联的对象:

serviceLocator.Setup(x => x.Resolve<SecurityHelper>())
              .Returns<SecurityHelper>(securityHelper.Object);

答案 1 :(得分:1)

在模拟设置中定义了两个Returns方法,需要单个参数:

 IReturnsResult<TMock> Returns(TResult value);
 IReturnsResult<TMock> Returns(Func<TResult> valueFunction);

第一个简单接受应该由mocked方法返回的值。第二个接受应该调用的函数来计算返回值。编译器无法确定您要执行的操作 - 将null传递为SecurityHelper实例,或传递给Func委托实例。因此,只需将null值转换为适当的类型以帮助编译器选择:

serviceLocator.Setup(x => x.Resolve<SecurityHelper>())
              .Returns((SecurityHelper)null);

注意:如果您想知道上述方法中的TResult是什么,它是返回传递给setup的Func表达式的类型:

 ISetup<TResult> Setup<TResult>(Expression<Func<TResult>> expression)

即。这是mocked方法返回的值的类型。在您的情况下,它将是Resolve<SecurityHelper>()调用返回的类型。

更新:编辑后 - 您尝试返回Mock<SecurityHelper>类型的值。但Returns期望TResult属于SecurityHelper类型(请参见上文说明原因)。因此,您需要传递模拟对象实例securityHelper.Object