即使使用null
FPosition
对象,分配操作也会分配new
public void SetPosition(IPositionCollector aCollector_in, Vector3d aVector_in)
{
FPosition aPosition = new FPosition
{
CoordinateX = aVector_in.X,
CoordinateY = aVector_in.Y,
CoordinateZ = aVector_in.Z
};
aCollector_in.Position = aPosition; // assigns null
}
我正在使用MOQ,而IPositionCollector
是一个MOQ代理对象。
在什么情景中它是可能的?我应该在MOQ对象上设置一些依赖吗?
在异常后使用SetupAllProperties
getitng:
at Moq.MethodCall..ctor(Mock mock, Expression originalExpression, MethodInfo method, Expression[] arguments)
at Moq.MethodCallReturn`2..ctor(Mock mock, Expression originalExpression, MethodInfo method, Expression[] arguments)
at Moq.Mock.<>c__DisplayClass15`2.<SetupGet>b__14()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.SetupGet[T1,TProperty](Mock mock, Expression`1 expression)
at Moq.Mock`1.SetupGet[TProperty](Expression`1 expression)
答案 0 :(得分:1)
尝试SetupAllProperties()
:
var mock = new Mock<IPositionCollector>();
mock.SetupAllProperties();
SetPosition(mock.Object, theVector);
答案 1 :(得分:1)
我认为你应该验证它的一部分行为 - 检查正确的位置对象是否分配给收集器:
// Arrange
var collectorMock = new Mock<IPositionCollector>();
var position = new FPosition
{
CoordinateX = vector.X,
CoordinateY = vector.Y,
CoordinateZ = vector.Z
};
// Act
sut.SetPosition(collectorMock.Object, vector)
// Assert
collectorMock.VerifySet(c => c.Position = position);
BTW FPosition
应该实现等于
如果FPosition
没有实施等于你并且你不希望它实现等于
// Arrange
var collectorMock = new Mock<IPositionCollector>();
// Act
sut.SetPosition(collectorMock.Object, vector)
// Assert
collectorMock.VerifySet(c => c.Position = It.Is<FPosition>(p =>
p.CoordinateX == vector.X &&
p.CoordinateY == vector.Y &&
p.CoordinateZ == vector.Z));
答案 2 :(得分:0)
将DefaultValue
设置为Mock
解决了这个问题。
aPositionCollectorMock.DefaultValue = DefaultValue.Mock;
并删除了对SetupAllProperties()
的调用。