C# 如何模拟对象列表

Mic*_*gan 2 c# unit-testing moq mocking stubbing

在 C# 中,如何模拟对象列表?

我正在尝试进行练习,它指定在单元测试的排列部分中我需要“模拟Book对象列表”。

创建 Book 对象的模拟列表的语法是什么?我尝试创建模拟 Book 对象并将它们添加到书籍列表中,但这不起作用。

public void Test_GetAllBooks_ReturnsListOfBooksItReceivesFromReadAllMethodOfReadItemCommand_WhenCalled()
{
    //Arrange
    Mock<ReadItemCommand> mockReadItemCommand = new Mock<ReadItemCommand>();
    Catalogue catalogue = new Catalogue(mockReadItemCommand.Object);

    Mock<Book> mockBook1 = new Mock<Book>();
    Mock<Book> mockBook2 = new Mock<Book>();
    List<Book> mockBookList = new List<Book>();
    mockBookList.Add(mockBook1);
    mockBookList.Add(mockBook2);

    mockReadItemCommand.Setup(r => r.ReadAll()).Returns(mockBookList);

    //Act
    List<Book> actual = catalogue.GetAllBooks();

    //Assert
    Assert.AreSame(mockBookList, actual);

}
Run Code Online (Sandbox Code Playgroud)

这给我带来了 2 个编译错误,都是 CS1503,在我尝试将模拟书籍添加到我的书籍类型列表的两行中。

Nko*_*osi 5

只需创建一个书籍列表来表示在执行被测方法时要返回的假/模拟数据。无需使用起订量来获取虚假数据。使用 Moq 模拟ReadItemCommand被测系统 ( ) 的依赖关系 ( Catalogue)

public void Test_GetAllBooks_ReturnsListOfBooksItReceivesFromReadAllMethodOfReadItemCommand_WhenCalled()
{
    //Arrange
    var mockReadItemCommand = new Mock<ReadItemCommand>();
    var catalogue = new Catalogue(mockReadItemCommand.Object);

    var expected = new List<Book>(){
        new Book {
            Title = "Book1", 
            //populate other properties  
        },
        new Book { 
            Title = "Book2", 
            //populate other properties  
        }
    };

    mockReadItemCommand
        .Setup(_ => _.ReadAll())
        .Returns(expected);

    //Act
    var actual = catalogue.GetAllBooks();

    //Assert
    Assert.AreSame(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)