我提前为糟糕的标题道歉 - 欢迎提出建议!
我一直在阅读有关 DI 和 AOP 的内容,并且我认为我掌握了基础知识;至少对于添加日志记录的规范示例。
我想将此应用于我们在 NUnit 中创建的测试用例,例如能够为所有测试用例方法和它们调用的任何“辅助方法”自动添加进入/退出日志记录。(而且我不依赖于 NUnit——如果在另一个框架中更容易,请告诉我。)
注意——这与被测对象无关;我想将这些技术应用于测试用例本身。
很清楚如何使用PostSharp做到这一点——这是他们的第一个例子。但是我不想仅仅为了这个实验将他们的许可处理添加到我们的项目中。
我发现的所有其他关于 AOP for C# 的参考都是基于 IoC 容器实现(如 CastleWindsor、Unity、Spring.Net 等)提供的(动态)拦截器......在这种情况下它们都有一个共同的问题:你需要一个一段设置代码,为要添加拦截器的对象创建代理。(我最初确实认为这段代码也必须创建一个 IoC 容器,但我发现我错了。)
但是我看不到这个设置代码将用于 nUnit 测试用例。
我提出的选项及其问题:
- 让 testfixture 类构造函数为其自身创建一个代理。由于递归(消费者要求事物,事物试图将代理返回到事物,代理试图创建事物......从阅读这个 StackOverflow 问题)
- 滚动我自己的基于反射的魔法(这对我来说是一项艰巨的任务)
- 让构造函数包装 testfixture 类中的所有方法并返回这个“包装”对象(不确定构造函数是否可以这样做)
- 在 testfixture 上使用静态构造函数来实现这一点(假设您可以动态地将类的方法包装到位。)
- 使用模块 cctor(通过Einar Egilsson 的 InjectModuleInitializer)在模块级别做一些事情,并使用日志记录包装所有类中的所有方法。
- 最简单的:某种用于实例化测试用例的工厂(不是测试的参数),我可以从中使用其中一个 IoC 代理生成器
- 对于 nUnit:我能找到的唯一方法是创建一个自定义 AddIn。优势 - 可能不会破坏与 ReSharper 的集成。缺点 - 部署到所有开发机器,尤其是在更新 NUnit 时。是否有其他方法可以为 nUnit 执行此操作?
- 对于 MbUnit:看起来它将测试用例视为第一类值,这是直截了当的。优点:易于部署给所有开发人员。缺点:测试不会出现在 Resharper 中。旁注:如何处理 setup 和 teardown。
我是否遗漏了我的选择和结论中的任何内容?
有没有我错过的更简单的方法?