.net 具有动态返回参数的模拟对象设置方法

.net 具有动态返回参数的模拟对象设置方法,.net,unit-testing,mocking,moq,.net,Unit Testing,Mocking,Moq,我有一个类位置,我想测试方法CreatePosition。方法如下所示: public Position CreatePosition(int horizontalIndex, int verticalIndex) { return new Position(horizontalIndex, verticalIndex); } Mock<IPosition> positionCreator = new Mock<IPosition>(); positionCre

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

public Position CreatePosition(int horizontalIndex, int verticalIndex)
{
    return new Position(horizontalIndex, verticalIndex);
}
Mock<IPosition> positionCreator = new Mock<IPosition>();
positionCreator.Setup(positionCreator.Object.CreatePosition(?, ?)).Returns( ?? );
接口位置:

public interface IPosition
{
     char HorizontalPosition { get; }
     int VerticalPosition { get; }
     int IndexHorizontal { get; }
     int IndexVertical { get; }
     Position CreatePosition(int horizontalIndex, int verticalIndex);
}
    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在这里使用,它是动态的-它为每对参数创建新位置:

    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
如下:

public Position CreatePosition(int horizontalIndex, int verticalIndex)
{
    return new Position(horizontalIndex, verticalIndex);
}
Mock<IPosition> positionCreator = new Mock<IPosition>();
positionCreator.Setup(positionCreator.Object.CreatePosition(?, ?)).Returns( ?? );
Mock positionCreator=new Mock();
positionCreator.Setup(positionCreator.Object.CreatePosition(?).Returns(?);

我想伪造这个方法,这样它就可以接受动态参数并返回动态结果,就像真实位置一样。有可能做到这一点吗?

在您的测试方法中可能会出现类似的情况:

positionCreator
    .Setup(x => x.CreatePosition(It.IsAny<int>, It.IsAny<int>))
    .Returns(new Position(givenHorizontalIndex, givenVerticalIndex));
positionCreator
.Setup(x=>x.CreatePosition(It.IsAny,It.IsAny))
.返回(新位置(给定的水平指数、给定的垂直指数));
您可以使用不同输入和预期输出的各种测试用例


或者您想要更详细的东西,在
[SetUp]
方法中连接所有内容,比如给定输入,返回输出?

在您的测试方法中可能类似于这样:

positionCreator
    .Setup(x => x.CreatePosition(It.IsAny<int>, It.IsAny<int>))
    .Returns(new Position(givenHorizontalIndex, givenVerticalIndex));
positionCreator
.Setup(x=>x.CreatePosition(It.IsAny,It.IsAny))
.返回(新位置(给定的水平指数、给定的垂直指数));
您可以使用不同输入和预期输出的各种测试用例


或者您想要更详细的东西,在
[SetUp]
方法中连接所有内容,比如给定输入,返回输出?

谢谢您的回答。有没有一种方法可以返回模拟对象而不是新位置?类似于Mock?不,Returns方法描述实际方法(
CreatePosition
)在测试期间调用时将返回什么,因此它必须接收与方法返回类型相同类型的参数。还有一个问题,因为it.IsAny是返回int的泛型方法,它不是一个整数。这只是一种说法,如果使用任何
int
参数调用该方法,它将返回您设置为返回的内容;另一种方法类似于
.Setup(x=>x.CreatePosition(2,3)
,这意味着只有在测试期间使用这些特定参数调用该方法时,它才会返回设置(否则,它将返回null-如果不执行其他设置,即)giveHorizontalIndex和GiveInverticalIndex呢?它们没有定义,但应该是动态的。谢谢你的回答。有没有一种方法可以让我返回模拟对象而不是新位置?类似于模拟?没有,返回方法描述了实际方法(
CreatePosition
)在测试期间调用时将返回,因此它必须接收与方法返回类型相同类型的参数。这也有一个问题,因为它是返回int的泛型方法,而不是整数。这只是一种说法,如果使用任何
int
参数调用该方法,它将返回您设置的值返回;另一种方法类似于
.Setup(x=>x.CreatePosition(2,3)
,这意味着只有在测试期间使用这些特定参数调用该方法时,它才会返回设置(否则它将返回null-如果不执行其他设置,即)那么giveHorizontalIndex和giveInverticalIndex呢?它们没有定义,但应该是动态的。