单元测试MVC4应用服务层

时间:2013-02-21 23:01:00

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我花了两天时间开始并重新启动这个学习过程,因为我真的不知道如何开始。

我有一个包含三层的MVC4应用程序:Web,Services和Core。控制器向Service层发送请求,该层提供控制器用于为视图保存viewModel的信息。

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

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);

}

我正在试图弄清楚如何创建一个单元测试类库来测试这些函数。

运行测试时,我希望删除TestDatabase(如果存在)并重新创建,并播放数据。我在我的Core项目中有一个“受保护”的种子方法以及 - 我可以使用它吗?如果是这样,怎么样?

我读过的每个地方都说在测试中从不使用数据库,但我无法弄清楚测试的重点是什么。这些服务用于访问和更新数据库......我不需要数据库来测试吗?

我已经创建了一个Project.Services.Tests单元测试项目,但不知道如何连接所有内容。如果可能的话,我想用代码而不是配置文件来做...任何例子或指针都会受到很多赞赏。

1 个答案:

答案 0 :(得分:2)

这个问题涉及很多方面,让我试着接近一些:

  • 单元测试是关于测试代码单元,最小可能的可测试代码段,但测试代码单元与数据库的交互是集成测试问题
  • 使用存储库模式解决此问题的一种方法 - 它是数据访问层的抽象层。您的服务界面看起来更像是一个存储库模式实现,更多地围绕它进行谷歌搜索。
  • 有些人不测试存储库模式的内部,他们只是断言对它的接口的调用。数据库测试被认为是集成测试问题。
  • 有些人通过在单元测试中编写SetUp和TearDown步骤直接命中他们的数据库,通常你会在SetUp中插入适当的数据,而TearDown会将它清理到以前的状态,但要注意 - 他们可以变得漂亮慢,让你的单位测试疼痛。
  • 其他方法是将测试配置为使用不同的数据库 - 例如SQLCE。对于某些ORM,数据库交换可能非常简单。这比点击“完整”数据库要快,而且看起来比较干净,但是数据库实现会产生差异,迟早会出现差异,让你的单元测试变得痛苦......
  • 目前随着NoSQL解决方案的增加,直接访问数据库变得非常容易,因为它们通常都有内存对应物(如RavenDB)

我意识到一开始可能有点压倒性,但同样,这个问题有很多方面。你把你的源代码发布到github并在这里分享它怎么样?