如何用假方面替换PostSharp Aspect进行单元测试

时间:2014-04-01 15:19:39

标签: c# unit-testing moq postsharp aspect

我有一个如下课程:

[Log]
public class SomeClass
{  }

LogAttribute是来自PostSharp的OnMethodBoundaryAspect。我希望将LogAttribute的所有实例换成一些虚假/模拟的方面版本,这样做什么都不做,以便我可以独立于运行的方面代码单元测试SomeClass。在集成测试期间,我将保持方面正常运行。 有谁知道如何实现类似的东西?

请注意,此项目使用Moq进行单元测试,将Ninject用于单元测试项目之外的DI。

谢谢!

2 个答案:

答案 0 :(得分:2)

请参阅此问题How do you disable PostSharp when running unit tests?

你可以告诉PostSharp不要在单元测试的方面进行编译。

答案 1 :(得分:0)

如果您的日志记录方面稍微遵循PostSharp教程,则应该写入System.Diagnostics.Trace

假设这是真的,您只需将DI框架配置为在运行测试时不在Trace中注册TextWriter (或系统日志,或类似的......);这使得方面可以像往常一样在运行时激活和运行,并且它们仍然写入Trace,您只是没有进行所有磁盘IO(因为您没有在System.Diagnostics.Trace中注册Stream Writer)

我已经成功地使用了我的实时日志记录方面,而且我的SUT或模拟没有问题。我还添加了一些带有几个简单方法的存根,一些用方面装饰,一些不用。然后我验证了实时方面的行为符合预期(例如Assert.Throws<MyWrappedException>。这些存根允许我隔离,以便Aspect是SUT,其他一切都被嘲笑,我可以断言该方面的行为与我预期的一样。那是不久前,我可能本可以使用Moq代替假货,但是没有理由改变那些代码;他们帮助验证我的方面是线程安全的。


作为另一种选择,您可以添加从OnMethodBoundaryAspect继承的存根或伪造,并让您的CI在测试运行时将其注册为您的Aspect而不是您的实时方面。如果您的实时方面没有写入Trace,或者如果您不能排除在测试时在Trace中注册系统日志记录或TextWriter,则可以让空白或接近空。然后,您可以控制存根方法的内容,并决定应该在内存中记录哪些内容以供以后检索/断言,以及应该忽略的内容。

因为这些方法是#protected,所以Moq不会对此感到高兴;对于一个纯粹的Moq'ist来说,这会感到痛苦或丑陋,但是,在这种情况下,你只谈论一个假类,它将与你的Moqs很好地共存。此外,它还允许您将测试与您的SUT隔离忽略方面,因此它有助于将测试范围缩小到您关心的类和行为。

将存根或伪类存储在与测试相同的项目中,然后将DI配置为在测试运行时而不是实际方面实例化存根。 PostSharp仍然会在编译时正确地注入到您的SUT中,如果编写存根,断言应该仍然成功