加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在DI Frameworks中使用AOP和C#TestFrameworks? (不适用于被

发布时间:2020-12-16 07:02:14 所属栏目:百科 来源:网络整理
导读:我提前为一个可怕的标题道歉 – 建议欢迎! 我一直在读DI和AOP,我想我掌握了基础知识;至少对于添加日志记录的规范示例. 我想将此应用于我们在NUnit中创建的测试用例,例如:能够为所有测试用例方法和他们调用的任何“帮助方法”自动添加进入/退出日志记录. (
我提前为一个可怕的标题道歉 – 建议欢迎!

我一直在读DI和AOP,我想我掌握了基础知识;至少对于添加日志记录的规范示例.

我想将此应用于我们在NUnit中创建的测试用例,例如:能够为所有测试用例方法和他们调用的任何“帮助方法”自动添加进入/退出日志记录. (而且我没有与NUnit联系 – 如果在另一个框架中更容易,请告诉我.)

注意 – 这不是关于被测试的主题;我想将这些技术应用于测试用例本身.

很清楚如何使用PostSharp这样做 – 这是他们的First example.但是我不想将他们的许可处理添加到我们的项目中进行这个实验.

我发现AOP for C#的所有其他参考都是基于IoC容器实现提供的(动态)拦截器,例如CastleWindsor,Unity,Spring.Net ……在这种情况下它们都有一个共同的问题:你需要一个一段安装代码,用于为要添加拦截器的对象创建代理. (我原本认为这段代码也必须创建一个IoC容器,但我发现我错了.)

但我无法看到这个设置代码将用于nUnit测试用例的位置.

我提出的选项,以及他们的问题:

>让testfixture类构造函数为自己创建一个代理.由于递归(消费者要求事物,事物试图将代理返回到事物,代理尝试创建事物……从阅读this StackOverflow question)将无法工作
>滚动我自己的反射魔术(对我来说这将是一项艰巨的任务)

>让构造函数包装testfixture类中的所有方法并返回此’wrapped’对象(不确定这是否可能构造函数执行此操作)
>在testfixture上使用静态构造函数来做这个魔术(假设您可以动态地将类的方法包装到位.)
>使用模块cctor(通过Einar Egilsson’s InjectModuleInitializer)在模块级别执行某些操作,并使用日志记录包装所有类中的所有方法.

>最简单的:用于实例化测试用例的某种工厂(非测试参数),我可以使用其中一个IoC代理生成器

>对于nUnit:我能找到的唯一方法是创建一个custom AddIn.优点 – 可能不会破坏与ReSharper的集成.缺点 – 部署到所有开发人员机器,尤其是对NUnit的更新.是否还有其他方法可以为nUnit执行此操作?
>对于MbUnit:看起来像treats testcases as first class values,这很简单.优点:易于部署到所有开发人员.缺点:测试不会出现在Resharper中.旁注:how to handle setup and teardown.

我的选项和结论中是否遗漏了任何内容?

有没有更简单的方法可以做到这一点,我错过了?

解决方法

面向方面编程不仅仅是使用动态代理(拦截)或后编译代码编织(PostSharp). AOP主要是关于增加跨领域的关注点.使用动态代理是增加横切关注点的一种方法.代码编织是另一种方法.但另一个IMO更好的方式是增加跨领域的关注.

不要使用动态代理或代码编织,而是让您的应用程序设计引导您.当您使用正确的抽象设计应用程序时,使用装饰器添加横切关注点很容易.您可以找到使用适当的抽象here和here设计的系统示例.

这些文章描述了如何使用装饰器定义横切关注点.以这种方式设计系统时,可以与其余代码分开测试跨领域问题的实现.使用正确的抽象时,这很容易.

执行此操作时,无需在单元测试中执行任何特殊操作.无需编码,无需在测试中运行DI容器为您构建对象.您可以在没有任何交叉问题的情况下测试您的应用程序逻辑.您可以单独测试每个小块,并将所有碎片放在应用程序的Composition Root中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读