【发布时间】:2020-08-13 00:11:24
【问题描述】:
假设我有一个名为 MyRequestHandler 的简单类,它有一个名为 ProcessRequest 的方法,该方法简单地接受一个请求对象,将其映射到一个返回对象并返回该对象。 (这显然是我正在研究的更复杂的方法/测试的一个非常简单的示例)。
public class MyRequestHandler
{
private IMapper _mapper;
public MyRequestHandler(IMapper maper)
{
_mapper = mapper;
}
public MyReturnObject ProcessRequest(MyRequestObject requestObject)
{
MyReturnObject returnObject = _mapper.Map<MyReturnObject>(requestObject);
return returnObject;
}
}
现在进行单元测试(使用 Xunit),我想测试 ProcessRequest 方法,但显然想 Moq Map 方法,如下所示:
MyRequestObject requestObject = new RequestObject()
{
RequestInt = 1,
RequestString = "Hello"
};
MyReturnObject returnObject = new MyReturnObject()
{
MyInt = 1,
MyString = "Hello"
};
Mock<IMapper> mockMapper = new Mock<IMapper>();
mockMapper.Setup(m => m.Map<MyRequestObject>(requestObject)).Returns(returnObject);
MyRequestHandler requestHandler = new MyRequestHandler(mockMapper.Object);
MyReturnObject response = requestHandler.ProcessRequest(requestObject);
Assert.Equal(returnObject.MyInt, response.MyInt);
Assert.Equal(returnObject.MyString, response.MyString);
这里的问题是 Moq 返回(我猜它应该很明显)对 returnObject 的引用,所以我的断言将始终通过,即使我的方法要在返回对象之前更改值。现在我可以在 Moq Setup/Return 中实例化一个新的 MyReturnObject 并通过我给新的值比较 MyInt 和 MyString,但是如果它是一个非常复杂的对象,有 20 个属性和对象列表呢?也许我想使用 AutoFixture 创建要返回的对象并使用 DeepEqual 来比较它们?这甚至可能吗?我是不是看错了,还是我必须在设置/返回中进行某种类型的克隆才能使其正常工作?
【问题讨论】:
标签: c# unit-testing moq