动态模拟对象设置方法,参数为 return

Mock object setup method with arguments to return dynamically

我有一个 class 位置,我想测试方法 CreatePosition。方法如下所示:

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

接口位置:

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

此处使用方法 CreatePosition,它是动态的 - 对于每对参数,它都会创建新的 Position:

    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( ?? );

我想伪造该方法,使其接受动态参数和 return 动态结果,就像真正的 Position 所做的那样。可以这样做吗?

也许在你的测试方法中是这样的:

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

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

或者您想要更精细的东西,您可以在 [SetUp] 方法中将其全部连接起来,比如给定输入,return 输出?