模拟内部对象因函数调用而丢失
Mocking inner objects gets lost with function call
我在模拟棋盘,我可以在上面添加棋子。我想单元测试允许 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) 函数,它应该 return IPiece.
如果我在上面的代码末尾尝试使用调试器 GetPiece(IPosition pos) 函数,一切正常,片段是 returned:
现在我创建新对象 LinearMoves,我在其中将棋盘作为参数传递:
linearMoves = new LinearMoves(Chessboard.Object, Piece_A1.Object);
在这个新对象中调用相同位置的GetPiece时,返回null:
IPiece currentPiece = chessboard.GetPiece(currentPosition);
基本上像 Piece_C1 和 Piece_A3 从来没有添加过。他们在哪里迷路了?似乎创建的 Chessboard 和作为参数传递给构造函数的 Chessboard 不是同一个对象。
编辑:
我发现使用模拟对象 Mock 进行搜索 return 是正确的结果,使用 IPosition 进行搜索没有 return 任何结果。
- 搜索
Mock<IPosition>
return 正确结果:
- 用
IPosition
搜索(但坐标相同)没有 return 任何东西:
问题是Position是引用类型,所以两个对象只有指向同一个对象才相等
你需要帮助你的设置方法比较Positions
chessboard.Setup(x => x.GetPiece(It.Is< Position>(k => k.X== "A" && K.Y ==3))).Returns(...);
我在模拟棋盘,我可以在上面添加棋子。我想单元测试允许 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) 函数,它应该 return IPiece.
如果我在上面的代码末尾尝试使用调试器 GetPiece(IPosition pos) 函数,一切正常,片段是 returned:
现在我创建新对象 LinearMoves,我在其中将棋盘作为参数传递:
linearMoves = new LinearMoves(Chessboard.Object, Piece_A1.Object);
在这个新对象中调用相同位置的GetPiece时,返回null:
IPiece currentPiece = chessboard.GetPiece(currentPosition);
基本上像 Piece_C1 和 Piece_A3 从来没有添加过。他们在哪里迷路了?似乎创建的 Chessboard 和作为参数传递给构造函数的 Chessboard 不是同一个对象。
编辑:
我发现使用模拟对象 Mock 进行搜索 return 是正确的结果,使用 IPosition 进行搜索没有 return 任何结果。
- 搜索
Mock<IPosition>
return 正确结果:
- 用
IPosition
搜索(但坐标相同)没有 return 任何东西:
问题是Position是引用类型,所以两个对象只有指向同一个对象才相等
你需要帮助你的设置方法比较Positions
chessboard.Setup(x => x.GetPiece(It.Is< Position>(k => k.X== "A" && K.Y ==3))).Returns(...);