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”类的调用。模拟服务定位器没有多大意义。它支持您的基础架构,但基础架构不直接使用它。更多