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

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

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

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

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

很明显如何使用PostSharp来做到这一点 – 这是他们的第一个例子。 但是,我不想将他们的许可处理添加到我们的项目中,仅用于此实验。

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

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

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

  1. 让testfixture类构造函数为自己创建一个代理。 由于递归(消费者要求事物,事物试图将代理返回到事物,代理尝试创建事物……从阅读此StackOverflow问题 )将无法工作
  2. 滚动我自己的reflection魔术(对我来说这将是一项艰巨的任务)
    1. 让构造函数包装testfixture类中的所有方法并返回这个’wrapped’对象(不确定这是否可能构造函数执行此操作)
    2. 在testfixture上使用静态构造函数来做这个魔术(假设您可以动态地将类的方法包装到位。)
    3. 使用模块cctor(通过Einar Egilsson的InjectModuleInitializer )在模块级别执行某些操作,并使用日志记录包装所有类中的所有方法。
  3. 最简单的:用于实例化测试用例的某种工厂(非测试参数),我可以使用其中一个IoC代理生成器
    1. 对于nUnit:我能找到的唯一方法是创建自定义AddIn 。 优势 – 可能不会破坏与ReSharper的集成。 缺点 – 部署到所有开发人员机器,尤其是对NUnit的更新。 是否还有其他方法可以为nUnit执行此操作?
    2. 对于MbUnit:看起来它将测试用例视为第一类值 ,这很简单。 优点:易于部署到所有开发人员。 缺点:测试不会出现在Resharper中。 旁注: 如何处理设置和拆卸 。

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

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

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

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

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

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