c#如何模拟对象列表

时间:2017-04-17 15:47:17

标签: c# unit-testing mocking moq stubbing

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

我正在尝试练习,并且它指定在我的单元测试的安排部分中我需要&#34;模拟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); } 对象的列表&#34;。

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

<a class="vasile" href="http://partnerwebsite.com"> Vasile.com </a>
In CSS file add this:
a.vasile {
background-image:url(http://imagethatyouwantotuse.com/image.jpg);
display:block;
height:?px;
width:?px;}

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

2 个答案:

答案 0 :(得分:1)

只需创建一个书籍列表来表示在执行测试方法时要返回的假/模拟数据。不需要使用Moq来伪造数据。使用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);
}

答案 1 :(得分:0)

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

How do I clone a generic list in C#?

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