Mock对象设置方法,带有动态返回的参数

时间:2016-10-14 07:00:48

标签: .net unit-testing mocking moq

我有一个课程职位,我想测试方法CreatePosition。方法如下所示:

public Position CreatePosition(int horizontalIndex, int verticalIndex)
{
    return new Position(horizontalIndex, verticalIndex);
}

界面IPosition:

public interface IPosition
{
     char HorizontalPosition { get; }
     int VerticalPosition { get; }
     int IndexHorizontal { get; }
     int IndexVertical { get; }
     Position CreatePosition(int horizontalIndex, int verticalIndex);
}

方法CreatePosition在这里使用,它是动态的 - 对于每对参数,它创建新的位置:

    private void AddToAllowedPositions(IPosition positionCreator)
    {
          int horizontalIndex = piece.Position.IndexHorizontal;
          int verticalIndex = piece.Position.IndexVertical;

          while(IndexesAreValid(horizontalIndex, verticalIndex)
         {
                IPosition currentPosition = positionCreator.CreatePosition(horizontalIndex, verticalIndex);
                allowedPosition.Add(currentPosition);
         }
    }

我的问题是我不知道如何假冒方法CreatePosition。

我已经像这样创建了Mock<IPosition>

Mock<IPosition> positionCreator = new Mock<IPosition>();
positionCreator.Setup(positionCreator.Object.CreatePosition(?, ?)).Returns( ?? );

我想伪造那个方法,所以它会接受动态参数并返回动态结果,就像真正的Position正在做的那样。有可能这样做吗?

1 个答案:

答案 0 :(得分:2)

在您的测试方法中可能是这样的:

positionCreator
    .Setup(x => x.CreatePosition(It.IsAny<int>, It.IsAny<int>))
    .Returns(new Position(givenHorizontalIndex, givenVerticalIndex));

你可以拥有不同输入和预期输出的各种测试用例。

或者您是否想要更精细的内容,您可以在[SetUp]方法中将其全部连接起来,就像输入一样,返回输出?