2017-04-17 59 views
-2

在C#中的列表,我如何去嘲笑对象的列表?C#如何嘲笑的对象

我试图锻炼,并指定在我的单元测试的安排部分,我需要“模拟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,在两行,我试图模拟的图书添加到我喜欢的类型图书的清单。

+0

显示你已在[MCVE]到目前为止已经试过。也许那么,可以提供更好的帮助。这个练习中的一切都可以在这个网站找到,因为它已经被问过了。 – Nkosi

+1

我投票结束这个问题作为题外话,因为家庭作业问题必须显示你到目前为止已经尝试了什么,并具体说明你卡在哪里。正如所写,这只是“给我一个代码”。 – EJoshuaS

+0

好吧,不好意思,我是软件开发新手(因此是问题),也是StackOverflow的新手 - 对于我的问题不需要这种反应。我认为很明显,我的问题是关于如何去嘲弄对象列表。请现在看我上面的代码。 –

回答

1

只需创建的书来表示假/嘲笑数据的列表行使被测方法时返回。不需要使用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); 
} 
+0

感谢解决方案Nkosi。这解决了编译错误的问题。然而,运动同时指定了“你需要模拟图书对象的名单”和“您需要将您的存根模拟ReadItemCommand的ReadAll()方法返回的模拟书单”。所以,我不需要模拟书籍列表或实际书籍对象的模拟列表吗?我被告知只有被测试的对象应该是真实的,并且测试中使用的所有其他对象应该是嘲笑的。 [很抱歉,如果这些愚蠢的问题,我发现嘲讽非常混乱!] –

+0

@MichaelHennigan图书列表充当模拟数据源。它们不是来自实时持久数据的实际数据。因此他们嘲笑。实际的模拟是依赖性,书籍列表是模拟功能的一部分。唯一一次你真正模拟Book对象的方法是,如果实际的对象会影响对象的测试。 – Nkosi

+0

好的,谢谢你的解释!我想我现在终于明白了。 –

0

如果我得到你的权利,你可以克隆列表: 例如,如下所示:

How do I clone a generic list in C#?

,你可以以同样的方式复制它,或者相反,你可以自己复制列表创建一个新列表并添加源列表中每个元素的副本。 希望它有帮助。

+0

喂土狼。感谢您的建议。我是C#的新手,所以请耐心等待。克隆与使用Moq嘲弄相同吗?同样可以使用模拟来实现吗?我专门被要求使用Moq进行这项练习。 –