c# - Moq 设置 ServiceLocator

标签 c# .net moq

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

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 模拟。

最佳答案

尝试这样的事情:

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

关于c# - Moq 设置 ServiceLocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386519/

相关文章:

c# - 如何捕获 system.xml.xml 异常

c# - Dotliquid 模板渲染输出文件路径

c# - C# 中的 WebSphere MQ 监听器

c# - 如何在单元测试中使用 Moq 在异步方法中返回传递的参数?

unit-testing - 使用最小起订量模拟虚拟只读属性

C# - SignalR 如何删除我的事件处理程序

javascript - 如果浏览器在 asp .net 中关闭,请从浏览器注销?

c# - 在 DataGridView 垂直滚动条上绘制标记

c# - 如何设置文件版本注释

c# - 将模拟参数传递给模拟接口(interface)