MOQ代理对象上的null赋值



即使使用new 实例化FPosition对象,分配操作也会分配null

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代理对象。

在什么情况下是可能的?我应该在最小起订量对象上设置一些依赖项吗?

使用SetupAllProperties后,出现以下异常:

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)

尝试SetupAllProperties():

var mock = new Mock<IPositionCollector>();
mock.SetupAllProperties();
SetPosition(mock.Object, theVector);

我认为这是你应该验证的行为的一部分-检查分配给收集器的位置对象是否正确:

// 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应实现Equals

或者,如果FPosition没有实现Equals,并且您不希望它实现Equals-

// 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));

DefaultValue设置为Mock解决了此问题。

aPositionCollectorMock.DefaultValue = DefaultValue.Mock;

以及,删除了对SetupAllProperties()的调用。

相关内容

  • 没有找到相关文章

最新更新