Moq设置ServiceLocator

3
我正在尝试为单元测试设置服务定位器,如下所示:

var mockS = new Mock<IServiceLocator>();
ServiceLocator.SetLocatorProvider(() => mockS.Object);
mockS.Setup(x => x.GetInstance<IObjectFactoryMethod<IAddress>>()).Returns(new Mock<ObjectsFactory>().Object);

var factoryMock = new Mock<IObjectFactoryMethod<IAddress>>(MockBehavior.Strict);
factoryMock.Setup(x => x.Create(null)).Returns(new Mock<IAddress>());

var factory = ServiceLocator.Current.GetInstance<IObjectFactoryMethod<IAddress>>();

// testing - factory returns null
var address = factory.Create(null); // address is null

代码可以正常执行。在调试期间,工厂显示为模拟工厂,但是当调用Create(null)时,它返回null而不是新的IAddress模拟对象。


你的“create”似乎正在一个你没有使用的对象上进行设置。 - Duncan Howe
1个回答

7

尝试以下代码:

var mockS = new Mock<IServiceLocator>();
ServiceLocator.SetLocatorProvider(() => mockS.Object);

var factoryMock = new Mock<IObjectFactoryMethod<IAddress>>(MockBehavior.Strict);
factoryMock.Setup(x => x.Create(null)).Returns(new Mock<IAddress>().Object);

mockS.Setup(x => x.GetInstance<IObjectFactoryMethod<IAddress>>()).Returns(factoryMock.Object);

var factory = ServiceLocator.Current.GetInstance<IObjectFactoryMethod<IAddress>>();

// testing - factory returns null
var address = factory.Create(null); // address is null

factoryMock应该是factoryMock.Object,而new Mock<IAddress>()应该是:new Mock<IAddress>().Object。 - ShaneKm
我会相应地修正答案,谢谢。我没有一个可尝试的反转环境。 - Duncan Howe
我相信Mock对象上有一个SetupProperty方法,你可以以类似设置方法的方式使用它。 - Duncan Howe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接