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");
}
答案 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
。