c# 如何模拟对象列表

c# How to mock a list of objects

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

我正在尝试一个练习,它指定在我的单元测试的编排部分我需要 "mock a List of Book objects"。

创建 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);

}

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

如果我猜对了,你可以克隆列表: 例如,如下所示:

How do I clone a generic list in C#?

您可以用相同的方式克隆它,或者您可以通过创建一个新列表并从源列表中添加每个元素的副本来自己复制列表。 希望对你有帮助。

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

的依赖项 (ReadItemCommand)
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);
}