微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我提前为一个可怕的标题道歉 – 建议欢迎!

我一直在读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更好的方式是增加跨领域的关注.

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐