过去两天我一直在开始和重新开始这个学习过程,因为我真的不知道如何开始。
我有一个包含三层的 MVC4 应用程序:Web、服务和核心。 Controller 向服务层发送请求,服务层提供 Controller 用于为 View 混合 View 模型的信息。
我的服务层有以下方法:
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(如果它存在)并重新创建,并用数据播种。我的核心项目中有一个“ protected ”的种子方法以及一个 - 我可以使用它吗?如果是这样,如何?
我读到的所有文章都说永远不要在测试中使用数据库,但我不太明白测试的意义何在。这些服务是用来访问和更新数据库的……我不需要数据库来测试吗?
我已经创建了一个 Project.Services.Tests 单元测试项目,但不知道如何连接所有内容。如果可能的话,我想用代码而不是配置文件来做……任何例子或指针都将不胜感激。
最佳答案
这个问题有很多方面,让我尝试解决一些问题:
- 单元测试是关于测试一个代码单元,最小的可测试代码片段,但是测试代码单元及其与数据库的交互是一个集成测试问题<
- 解决此问题的一种方法是使用存储库模式 - 它是数据访问层之上的抽象层。您的服务接口(interface)看起来更像是一个存储库模式实现,更多地搜索它。
- 有些人不测试存储库模式的内部结构,他们只是断言对其接口(interface)的调用。数据库测试被视为集成测试问题。
- 有些人通过在他们的单元测试中编写 SetUp 和 TearDown 步骤直接访问他们的数据库,通常您会在 SetUp 中插入适当的数据,TearDown 会将其全部清理到以前的状态,但请注意 - 他们可能会变得很漂亮变慢并使您的单元测试变得痛苦。
- 其他方法是将您的测试配置为使用不同的数据库——例如 SQLCE。对于某些 ORM,数据库交换可能非常容易。这比击中“完整”数据库更快,而且看起来更干净,但数据库实现存在差异,迟早会浮出水面并使您的单元测试痛苦...
- 目前,随着 NoSQL 解决方案的兴起,直接访问数据库变得非常容易,因为它们通常有对应的内存(如 RavenDB)
我意识到一开始可能有点不知所措,但同样,这个问题有很多方面。将源代码发布到 github 并在此处共享如何?
关于asp.net - MVC 4 应用程序服务层中的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013891/