C# Moq-基于输入返回模拟
我有一个C# Moq-基于输入返回模拟,c#,unit-testing,moq,C#,Unit Testing,Moq,我有一个IServiceLocator接口,它有一个方法:GetInstance() 当我对此进行模拟(使用Moq和NUnit)时,我希望能够在某些场景中返回模拟,但在其他场景中返回真正的实现 我知道我可以为我拥有的每个接口编写以下语句: var factory = new MockRepository(MockBehavior.Loose); var serviceLocator = factory.Create<IServiceLocator>();
IServiceLocator
接口,它有一个方法:GetInstance()
当我对此进行模拟(使用Moq和NUnit)时,我希望能够在某些场景中返回模拟,但在其他场景中返回真正的实现
我知道我可以为我拥有的每个接口编写以下语句:
var factory = new MockRepository(MockBehavior.Loose);
var serviceLocator = factory.Create<IServiceLocator>();
var myInterfaceMock = factory.Create<IMyInterface>();
serviceLocator.Setup(locator => locator.GetInstance<IMyInterface>())
.Returns(myInterfaceMock.Object);
var factory=newmockrepository(MockBehavior.Loose);
var serviceLocator=factory.Create();
var myInterfaceMock=factory.Create();
serviceLocator.Setup(locator=>locator.GetInstance())
.Returns(myInterfaceMock.Object);
对于某些接口和其他接口的实际实现,返回mock,但是否有这样做的方法,例如:
var serviceLocator = factory.Create<IServiceLocator>();
var myInterfaceMock = factory.Create<IMyInterface>();
//Real implementation which returns actual implementations of the interfaces
var realServiceLocator = new ServiceLocator();
//Setup the mock locator to return mocks in some circumstances, and calls to the real service locator in others
serviceLocator
.Setup(locator => locator.GetInstance<T>())
.Callback(() =>
{
var type = typeof (T);
if (type == IMyInterface)
{
return myInterfaceMock;
}
else
{
return realServiceLocator.GetInstance<T>();
}
});
var-serviceLocator=factory.Create();
var myInterfaceMock=factory.Create();
//返回接口的实际实现的实际实现
var realServiceLocator=新ServiceLocator();
//设置模拟定位器在某些情况下返回模拟,在其他情况下调用实际服务定位器
服务定位器
.Setup(locator=>locator.GetInstance())
.Callback(()=>
{
var类型=类型(T);
if(type==IMyInterface)
{
返回myInterfaceMock;
}
其他的
{
返回realServiceLocator.GetInstance();
}
});
您是否使用依赖项注入框架?工厂的对象类型是什么?如果我能多看一点代码或者对工厂是如何派生的有更多的了解,我会很有帮助。我编辑了上面的代码,以显示“factory”类是Moq“MockRepository”类。上面的“ServiceLocator”是我创建的一个类,它有效地包装了对AutoFacs“AutofacServiceLocator”类的调用。模拟服务定位器没有多大意义。它支持您的基础架构,但基础架构不直接使用它。这里有更多您使用的依赖注入框架吗?工厂的对象类型是什么?如果我能多看一点代码或者对工厂是如何派生的有更多的了解,我会很有帮助。我编辑了上面的代码,以显示“factory”类是Moq“MockRepository”类。上面的“ServiceLocator”是我创建的一个类,它有效地包装了对AutoFacs“AutofacServiceLocator”类的调用。模拟服务定位器没有多大意义。它支持您的基础架构,但基础架构不直接使用它。更多