【发布时间】:2014-09-07 20:37:49
【问题描述】:
我目前有一个使用实体框架进行 CRUD 操作的存储库。
这被注入到我需要使用这个 repo 的服务中。
使用 AutoMapper,我将实体模型投影到 Poco 模型上,然后服务返回 poco。
如果我的对象有多个属性,那么设置然后断言我的属性的正确方法是什么?
如果我的服务有多个 repo 依赖项,那么设置所有模拟的正确方法是什么? * - 一个类 [setup],其中为这些测试装置配置了所有模拟和对象?*****
我想避免进行 10 个测试,每个测试都有 50 个属性断言和数十个模拟设置。这使得可维护性和可读性变得困难。
我已经阅读了单元测试的艺术,但没有发现任何关于如何处理这种情况的建议。
我使用的工具是 Rhino Mocks 和 NUnit。
我也在 SO 上找到了这个,但它没有回答我的问题:Correctly Unit Test Service / Repository Interaction
这是一个表达我所描述内容的示例:
public void Save_ReturnSavedDocument()
{
//Simulate DB object
var repoResult = new EntityModel.Document()
{
DocumentId = 2,
Message = "TestMessage1",
Name = "Name1",
Email = "Email1",
Comment = "Comment1"
};
//Create mocks of Repo Methods - Might have many dependencies
var documentRepository = MockRepository.GenerateStub<IDocumentRepository>();
documentRepository.Stub(m => m.Get()).IgnoreArguments().Return(new List<EntityModel.Document>()
{
repoResult
}.AsQueryable());
documentRepository.Stub(a => a.Save(null, null)).IgnoreArguments().Return(repoResult);
//instantiate service and inject repo
var documentService = new DocumentService(documentRepository);
var savedDocument = documentService.Save(new Models.Document()
{
ID = 0,
DocumentTypeId = 1,
Message = "TestMessage1"
});
//Assert that properties are correctly mapped after save
Assert.AreEqual(repoResult.Message, savedDocument.Message);
Assert.AreEqual(repoResult.DocumentId, savedDocument.DocumentId);
Assert.AreEqual(repoResult.Name, savedDocument.Name);
Assert.AreEqual(repoResult.Email, savedDocument.Email);
Assert.AreEqual(repoResult.Comment, savedDocument.Comment);
//Many More properties here
}
【问题讨论】:
-
除了属性映射之外,您要测试的逻辑是否正常工作?
-
此时测试映射是否正确,验证是否正常工作,不会对有效数据抛出任何验证异常。
-
SetSeeker - 不要测试“任何”验证,测试“a”验证然后测试下一个。请参阅下面的更多详细信息。
-
可读性对于单元测试很重要,但可维护性和 DRY 则不是。最好有很多测试,每个测试一件事,最好用 1 个断言。
标签: c# unit-testing nunit repository-pattern rhino-mocks-3.5