在C#中,如何模拟对象列表?
我正在尝试一个练习,它在我的单元测试的arrange部分中指定我需要“模拟一组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);
}
这给了我两个编译错误,都是CS1503,在我试图将mock Book添加到我的Book类型列表中的两行代码中。
发布于 2017-04-22 04:17:17
只需创建一个图书列表来表示在执行测试方法时要返回的伪/模拟数据。不需要对假数据使用Moq。使用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);
}
发布于 2017-04-17 15:54:26
如果我没弄错,您可以克隆列表:例如,如下所示:
How do I clone a generic list in C#?
您可以用同样的方法克隆它,或者您可以自己复制列表,方法是创建一个新列表,然后从源列表中添加每个元素的副本。希望能有所帮助。
https://stackoverflow.com/questions/43454738
复制相似问题