如何模拟扩展IEnumerable的接口

Zol*_*iqa 9 c# ienumerable moq mocking

我正在使用Moq,我有以下界面:

public interface IGameBoard : IEnumerable<PieceType>
{
    ...  
}
public class GameBoardNodeFactory
{
    public virtual GameBoardNode Create (int row, int column, IGameBoard gameBoard)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有这样的测试:

var clonedGameBoardMock = new Mock<IGameBoard> (MockBehavior.Loose);
var gameBoardNodeFactoryMock = new Mock<GameBoardNodeFactory> ();
gameBoardNodeFactoryMock.Setup (x =>
    x.Create (
        position.Row,
        position.Column,
        clonedGameBoardMock.Object)).Returns (new GameBoardNode { Row = position.Row, Column = position.Column });
Run Code Online (Sandbox Code Playgroud)

但是然后gameBoardNodeFactoryMock.Object.Create(position.Row,position.Column,clonedGameBoardMock.Object)抛出NullReferenceException.我试图为IGameBoard创建一个模拟,这样它就不会扩展IEnumerable <PieceType>接口,然后它就可以了.

任何帮助表示赞赏.

Dan*_*ant 12

如果要调用GetEnumerator(),则需要为其创建一个Setup.就像是:

var mockPieces = new List<PieceType>;
clonedGameBoardMock.Setup(g => g.GetEnumerator()).Returns(mockPieces.GetEnumerator());
Run Code Online (Sandbox Code Playgroud)

请注意在这种情况下是否存在问题,但值得注意的是您是否需要模拟IEnumerable<T>.


Zol*_*iqa 0

好吧,如果有人感兴趣,我将 Moq 更新到版本 4,现在一切都按预期进行。