【问题标题】:Unit Testing an MVC4 Application Service Layer单元测试 MVC4 应用程序服务层
【发布时间】:2013-02-21 23:00:59
【问题描述】:

过去两天我一直在开始和重新开始这个学习过程,因为我真的不知道如何开始。

我有一个包含三层的 MVC4 应用程序:Web、Services 和 Core。控制器向服务层发送请求,服务层提供控制器用来为视图水合视图模型的信息。

我的服务层有以下方法:

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,并用数据播种。我的核心项目中有一个“受保护的”种子方法以及 - 我可以使用它吗?如果是这样,怎么做?

我读到的每一个地方都说永远不要在你的测试中使用数据库,但我不能完全弄清楚测试的意义是什么。这些服务用于访问和更新数据库……我不需要数据库来测试吗?

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

【问题讨论】:

  • 这个问题没有一个绝妙的解决方案,你能多写一点吗——比如你用的是什么ORM,你的数据库是什么?

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


【解决方案1】:

这个问题有很多方面,让我尝试处理一些:

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

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

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多