3

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

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

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

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 单元测试项目,但不知道如何连接所有内容。如果可能的话,我想用代码而不是配置文件来做......任何例子或指针都会非常感激。

4

1 回答 1

2

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

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

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

于 2013-02-22T09:54:46.920 回答