Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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 MVC4应用程序服务层的单元测试_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc 4 - Fatal编程技术网

Asp.net MVC4应用程序服务层的单元测试

Asp.net MVC4应用程序服务层的单元测试,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,在过去的两天里,我开始并重新开始了这个学习过程,因为我真的不知道如何开始 我有一个MVC4应用程序,它有三层:Web、服务和核心。控制器向服务层发送请求,服务层提供控制器用于为视图创建viewModels的信息 我的服务层中有以下方法: public interface ISetServices { List<Set> GetBreadcrumbs(int? parentSetId); Set GetSet(int? setId); Set CreateSet

在过去的两天里,我开始并重新开始了这个学习过程,因为我真的不知道如何开始

我有一个MVC4应用程序,它有三层:Web、服务和核心。控制器向服务层发送请求,服务层提供控制器用于为视图创建viewModels的信息

我的服务层中有以下方法:

public interface ISetServices
{
    List<Set> GetBreadcrumbs(int? parentSetId);
    Set GetSet(int? setId);
    Set CreateSet(string name, string details, int? parentSetId);
    void DeleteSet(int? setId);

    Card GetCard(int? cardId);
    Card CreateCard(List<string> sides, string details, int? parentSetId);
    void DeleteCard(int? cardId);

    Side GetSide(int? sideId);
    List<String> GetSides(Card card);
    Side CreateSide(Card card, string content);
    void DeleteSide (int? sideId);

}
公共接口ISetServices
{
列出GetBreadcrumbs(int?parentSetId);
设置GetSet(int?setId);
Set CreateSet(字符串名称、字符串详细信息、int?parentSetId);
无效删除集(int?setId);
卡片获取卡片(int?cardId);
Card CreateCard(列表边、字符串详细信息、int?parentSetId);
作废删除卡(int?cardId);
Side GetSide(内部?侧ID);
名单(卡片);
Side CreateSide(卡片、字符串内容);
void DeleteSide(int?sideId);
}
我试图弄清楚如何创建一个单元测试类库来测试这些函数

当测试运行时,我希望删除一个TestDatabase(如果它存在的话),然后重新创建,并用数据作为种子。我的核心项目中有一个“受保护”的种子方法,还有一个-我可以使用这个吗?如果是,怎么做

我读到的每一篇文章都说不要在测试中使用数据库,但我不太明白测试的意义所在。这些服务用于访问和更新数据库。。。我不需要一个数据库来测试吗


我创建了一个Project.Services.Tests单元测试项目,但不知道如何连接所有内容。如果可能的话,我想用代码而不是配置文件来完成它。。。如有任何示例或提示,将不胜感激

这个问题有很多方面,让我试着探讨一下:

  • 单元测试是关于测试一个代码单元,即可能最小的可测试代码段,但测试代码单元与数据库的交互是一个集成测试问题
  • 解决这个问题的一种方法是使用存储库模式——它是数据访问层上的一个抽象层。你的服务界面看起来更像是一个存储库模式的实现,谷歌更关注它
  • 有些人不测试存储库模式的内部,他们只是对其接口断言调用。数据库测试被认为是一个集成测试问题
  • 有些人通过在单元测试中编写安装和拆卸步骤直接访问数据库,通常您会在安装中插入适当的数据,拆卸会将其清理到以前的状态,但请注意,它们可能会变得非常缓慢,并使单元测试变得痛苦
  • 另一种方法是将测试配置为使用不同的数据库,例如SQLCE。对于某些ORMs,数据库交换可能非常容易。这比访问“完整”数据库要快,而且看起来更干净,但数据库实现存在差异,这些差异迟早会显现出来,并使您的单元测试变得痛苦
  • 目前,随着NoSQL解决方案的兴起,直接访问数据库变得非常容易,因为它们通常都有对应的内存(如RavenDB)

我意识到一开始可能有点难以承受,但同样,这个问题有很多方面。您可以将源代码发布到github并在此处共享吗?

对于这个问题,没有一个绝妙的解决方案,您可以写得更详细一点吗?例如,您是否使用了任何ORM,您的数据库是什么?