Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC单元测试-伪造的存储库已变得难以操作_Asp.net Mvc_Unit Testing_Mocking_Repository - Fatal编程技术网

Asp.net mvc ASP.NET MVC单元测试-伪造的存储库已变得难以操作

Asp.net mvc ASP.NET MVC单元测试-伪造的存储库已变得难以操作,asp.net-mvc,unit-testing,mocking,repository,Asp.net Mvc,Unit Testing,Mocking,Repository,事情一开始就很简单,我的假存储库包含实体的硬编码列表 随着我的进步,我共享的虚拟存储库变得臃肿。我不断地向这些列表中添加新属性和新实体。这使得维护非常困难,也很难看到测试在做什么。我相信这是一个反模式,称为“” 在研究ASP.NETMVC单元测试的过程中,我看到了两种准备传递给控制器的存储库装置的方法 创建所有测试共享的硬编码假存储库 每个测试中存储库的模拟部分 我很想探索上面的选项2,但我已经了解到模拟存储库不是一个好主意,而且在我测试一个在集合上运行的控制器(即具有分页/排序/过滤功能)的场

事情一开始就很简单,我的假存储库包含实体的硬编码列表

随着我的进步,我共享的虚拟存储库变得臃肿。我不断地向这些列表中添加新属性和新实体。这使得维护非常困难,也很难看到测试在做什么。我相信这是一个反模式,称为“”

在研究ASP.NETMVC单元测试的过程中,我看到了两种准备传递给控制器的存储库装置的方法

  • 创建所有测试共享的硬编码假存储库
  • 每个测试中存储库的模拟部分
  • 我很想探索上面的选项2,但我已经了解到模拟存储库不是一个好主意,而且在我测试一个在集合上运行的控制器(即具有分页/排序/过滤功能)的场景中,这似乎非常令人畏惧

    我向社区提出的问题


    除了基本示例之外,还有哪些方法可以很好地准备存储库固定装置?

    出于类似的原因,我正在研究使用ORM的一个新项目(在我的例子中是NHibernate)。这样,我可以将它指向“内存中”的SQLLite实例(而不是SQL Server),并且它应该更易于设置/维护(我希望如此)。这样,如果我需要测试特定场景(如超时等),我只需要模拟存储库。

    如果您使用TDD的单元测试,请下载并使用optione#2。

    在大多数情况下,我们使用特定于测试的存储库模拟。我从来没有看到过不亲自做这件事的建议,我发现它非常有效。在大多数情况下,我们的存储库方法和mock只返回单个模型或模型列表(而不是数据上下文),因此很容易为每个测试创建特定的数据,并与每个查询隔离。这意味着我们可以模拟我们喜欢的任何数据,而不会影响同一测试中的其他测试或查询。很容易看出创建数据的原因和测试内容


    我参加的团队也决定不时创建共享的模拟数据。我认为这个决定通常是因为例程生成了动态查询,模拟所有测试所需的数据导致了数据库的大部分被复制。但是,回想起来,我可能会建议只检查结果查询,而不检查从数据库返回的内容。因此,不会对任何数据进行模拟,尽管它需要一些代码更改。我提到这一点只是为了说明,如果您无法找到使选项2工作的方法,也许有一种方法可以重构代码以使其更易于测试。

    我认为您不应该只选择这两个选项中的一个。有些情况下,使用假存储库会更好,有些情况下,模拟会更好。我认为你应该根据具体情况评估你需要什么。例如,如果您正在为需要调用返回布尔值的
    IUserRepository.DoesUserExist()
    UsersService
    编写测试,那么您不会使用假存储库,只需模拟调用以返回true或false就更容易了


    太棒了。

    还有MOQ(),我已经用了2年了。我也发现这是非常笨拙和耗时的,这就是为什么我要从ORM的角度来研究。这些都是很好的答案。自从我把这个问题发布到单独测试的模型库中以来,我一直在使用Moq,它工作得很好。我相信按照你的建议使用这两种方法是有效的。我还发现创建生成用于模拟的数据的例程很有用——这样我就不会复制代码来创建数据,但数据也不会共享。:)