我目前有一个使用实体框架进行 CRUD 操作的存储库。
这被注入到我需要使用这个 repo 的服务中。
使用 AutoMapper,我将实体模型投影到 Poco 模型上,并且 poco 由服务返回。
如果我的对象有多个属性,那么设置然后断言我的属性的正确方法是什么?
如果我的服务有多个 repo 依赖项,那么设置所有模拟的正确方法是什么?* - 为这些测试装置配置所有模拟和对象的类 [设置]?*****
我想避免进行 10 个测试,每个测试都有 50 个属性断言和数十个模拟设置。这使得可维护性和可读性变得困难。
我已经阅读了单元测试的艺术,并没有发现任何关于如何处理这种情况的建议。
我使用的工具是 Rhino Mocks 和 NUnit。
我也在 SO 上找到了这个,但它没有回答我的问题:正确地单元测试服务/存储库交互
这是一个表达我所描述内容的示例:
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
}