模拟内部对象会因函数调用而丢失

时间:2016-10-13 07:33:57

标签: c# unit-testing xunit fluent-assertions

我在嘲笑棋盘,我可以在棋盘上添加棋子。当棋盘上有一些棋子时,我想对允许的LinearMoves进行单元测试。

代码以:

开头
Chessboard.Object.AddPiece(Piece_C1.Object);
Chessboard.Object.AddPiece(Piece_A3.Object);
Chessboard.Setup(x => x.GetPiece(C1.Object)).Returns(Piece_C1.Object);
Chessboard.Setup(x => x.GetPiece(A3.Object)).Returns(Piece_A3.Object);

正如你所看到的,我首先在这个棋盘上设置了棋盘和两个棋子。我还模拟了GetPiece(IPosition)函数,它应该返回IPiece。

如果我在上面的代码末尾尝试调试器GetPiece(IPosition pos)函数,一切都OK,返回片段:

enter image description here

现在我创建新对象LinearMoves,我将棋盘作为参数传递:

linearMoves = new LinearMoves(Chessboard.Object, Piece_A1.Object);

当在这个新对象中调用具有相同位置的GetPiece时,它会返回null:

IPiece currentPiece = chessboard.GetPiece(currentPosition);

基本上没有添加Piece_C1和Piece_A3。他们在哪里迷路了?看起来像Chessboard创建并且Chessboard作为参数传递给构造函数不是同一个对象。

修改

我发现使用模拟对象Mock进行此搜索会返回正确的结果,使用IPosition搜索不会返回任何内容。

  1. 使用Mock<IPosition>搜索会返回正确的结果:
  2. enter image description here

    1. 使用IPosition搜索(但坐标相同)不会返回任何内容:
    2. enter image description here

1 个答案:

答案 0 :(得分:1)

问题是Position是一个引用类型,因此只有当两个对象指向同一个对象时它们才相等。

您需要帮助您的设置方法比较位置

chessboard.Setup(x => x.GetPiece(It.Is< Position>(k => k.X== "A" && K.Y ==3))).Returns(...);