C# Mocking.nettiers数据存储库调用

C# Mocking.nettiers数据存储库调用,c#,asp.net,mocking,typemock,.nettiers,C#,Asp.net,Mocking,Typemock,.nettiers,我有一个项目,我正在使用.nettiers生成的代码作为我的DAL 目前,我的测试包括为每个测试在数据库中物理设置测试数据,然后允许nettiers对象访问数据库并根据需要返回 显然,这不是特别有效,到目前为止,我的250多个测试运行大约需要10分钟,所以我一直在考虑在测试中添加模拟 虽然我很确定我理解模拟数据库调用的概念,但我特别难以将其应用于nettiers,因为它与数据库的耦合相当强 我想测试的方法之一如下(为了简洁起见,稍微减少): 目前,我正在使用Typemock的一个试用版,因为这似

我有一个项目,我正在使用.nettiers生成的代码作为我的DAL

目前,我的测试包括为每个测试在数据库中物理设置测试数据,然后允许nettiers对象访问数据库并根据需要返回

显然,这不是特别有效,到目前为止,我的250多个测试运行大约需要10分钟,所以我一直在考虑在测试中添加模拟

虽然我很确定我理解模拟数据库调用的概念,但我特别难以将其应用于nettiers,因为它与数据库的耦合相当强

我想测试的方法之一如下(为了简洁起见,稍微减少):

目前,我正在使用Typemock的一个试用版,因为这似乎是必需的,但我对任何替代方案都持开放态度,特别是开源的

我遇到的第一个问题是我是否应该创建InterfaceManagerService、DataRepository或实体本身的模拟实例(nettiers实体确实有一个可能有用的接口)

第二个问题是,如何创建要返回的伪对象,因为nettiers将一堆额外的属性放入实体中,如果我为每个我期望的对象创建一个伪实例,这将导致大型且难以处理的测试


我想最终,我正在寻找一种最佳的方法,为使用nettiers数据存储库方法的方法编写单元测试,但要避免对数据库造成影响,因为目前互联网上似乎没有太多关于它的内容。

我使用TypeMock,我非常喜欢它。模仿类的内部结构非常容易。我要做的是重写DataRepository类,让TypeMock向使用它的组件返回一个预期的结果集,以确保该组件按预期工作

但实际上,这取决于你在测试什么。如果您正在测试服务,请伪造数据存储库并返回预期结果。如果您正在测试存储库,那么请伪造存储库使用的内部构件。因此,一个好主意是伪造对正在测试的组件的外部引用,IMHO


嗯。

我使用TypeMock,我非常喜欢它。模仿类的内部结构非常容易。我要做的是重写DataRepository类,让TypeMock向使用它的组件返回一个预期的结果集,以确保该组件按预期工作

但实际上,这取决于你在测试什么。如果您正在测试服务,请伪造数据存储库并返回预期结果。如果您正在测试存储库,那么请伪造存储库使用的内部构件。因此,一个好主意是伪造对正在测试的组件的外部引用,IMHO


嗯。

我将根据我的个人经验提出一些建议。虽然这些可能无法解决您所有的担忧,但我希望它们至少会对您有所帮助

  • Rhino Mocks是一个相当著名的模拟框架。如果您正在寻找Typemock的替代品,我建议您这样做

  • 关于是模拟InterfaceManagerService还是模拟DataRepository,我认为这取决于您要测试的内容。是否要测试InterfaceManager服务?然后,您需要为DataRepository.FileProvider和DataRepository.DataDocumentProvider创建模拟对象。如果你还不熟悉“依赖注入”的概念,那么就去研究它;看起来您应该对InterfaceManagerService类应用一些依赖注入(假设您想要对其进行单元测试)

    如果您想对使用InterfaceManagerService的代码进行单元测试,那么只需模拟InterfaceManagerService

。。。如何创建要返回的伪对象,因为nettiers 将一组额外属性放入将产生的实体中 在大型且笨拙的测试中,如果我为每个 我期待的对象

  • 编写单个单元测试很容易。编写许多单元测试来覆盖您需要覆盖的所有场景,并且以一种高效的方式这样做,不会导致在整个单元测试中有太多代码被复制,这是很困难的,尤其是当被测试方法的输入和输出很复杂时

    对于这一点,我没有太多的指导,只是说我个人的方法是尝试整合测试初始化逻辑和测试验证逻辑,以避免大量代码重复,但与此同时,我尽量避免使单元测试代码本身变得如此复杂,以至于难以理解并容易出现错误

    一般来说,我认为我最终将测试逻辑分为3类:输入/初始化、期望和结果/验证。我发现将逻辑放在这三个类别中有助于我在单元测试中整合公共代码

    死硬的测试驱动开发支持者可能会说,努力生成一组干净的单元测试代码表明应用程序存在设计缺陷。我不会不同意这一点,但我会说,不幸的是,我参与的项目通常没有生成一个既简单又全面的单元测试代码库。简单的单元测试通常不会真正探索有问题的场景,而全面的单元测试通常需要大量的测试设置逻辑


    • 我将根据我的个人经验提出一些建议。虽然这些可能无法解决您所有的担忧,但我希望它们至少会对您有所帮助

      • Rhino Mocks是一个相当著名的模拟框架。如果你正在寻找
        public class InterfaceManagerService
        {
            public DataDocument SaveDataDocument(DataDocument entity)
            {
                var lookupEntity = DataRepository.DataDocumentProvider.GetByDocumentId(entity.DocumentId);
                if (lookupEntity == null)
                {
                    File fileEntity = new File();
                    fileEntity.Name = entity.Name;
        
                    var savedFileEntity = DataRepository.FileProvider.Save(fileEntity);
        
                    entity.FileId = savedFileEntity.FileId;
        
                    var savedEntity = DataRepository.DataDocumentProvider.Save(entity);
        
                    return (savedEntity);
                }             
            }
        }