繁体   English   中英

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

[英]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)函数,该函数应返回IPiece。

如果我在上面的代码末尾尝试使用调试器GetPiece(IPosition pos)函数,则一切正常,并返回一条:

在此处输入图片说明

现在,我创建新的对象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>搜索可返回正确结果:

在此处输入图片说明

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

在此处输入图片说明

问题是Position是引用类型,因此两个对象仅在指向同一对象时才相等。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM