2016-10-14 78 views
0

我有一个类位置,我想测试方法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(??); 

我想假冒该方法,因此将接受动态参数和返回动态结果,就像真正的位置做。是否有可能做到这一点?

回答

2

也许这样的事情在您的测试方法:

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

,你可以有不同的测试例不同的输入和预期的产出。

或者你想要更精细的东西,你可以在[SetUp]方法中把它连接起来,就像给定输入一样,返回那个输出?

+0

感谢您的回答。有没有办法返回Mock对象而不是新的Position?像模拟? – FrenkyB

+0

否,Returns方法描述了在测试期间调用实际方法('CreatePosition')时将返回什么,所以它必须接收与方法的返回类型相同类型的参数 –

+0

还有一个问题,因为它。 IsAny 是返回int的泛型方法,它不是一个整数。 – FrenkyB

相关问题