如果您的日志记录方面有点遵循 PostSharp 教程,那么它应该写入System.Diagnostics.Trace
.
假设这是真的,您只需将 DI 框架配置为在运行测试时不在 Trace 中注册 TextWriter (或系统日志记录或类似...);这让切面在运行时触发并正常运行,并且它们仍然写入 Trace,您只是没有进行所有磁盘 IO(因为您没有在 中注册 Stream Writer System.Diagnostics.Trace
)。
我已经在我的实时日志记录方面成功地使用了它,并且我的 SUT 或模拟没有问题。我还添加了一些带有一些简单方法的存根,有些用方面进行了装饰,有些则没有。然后,我验证了 live 方面的行为符合预期(Assert.Throws<MyWrappedException>
例如)。这些存根允许我隔离,以便 Aspect 是 SUT,其他一切都被嘲笑,我可以断言切面的行为符合我的预期。那是前一阵子,我可能可以使用 Moq 代替假货,但没有理由更改该代码;他们帮助验证我的方面是线程安全的。
作为另一种选择,您可以添加一个继承自 的存根或伪造OnMethodBoundaryAspect
,并让您的 CI 在测试运行时将其注册为您的方面,而不是您的实时方面。如果您的 live 方面没有写入 Trace,或者如果您不能排除在测试时在 Trace 中注册系统日志记录或 TextWriter,这可以让您将胆量留空或接近空。然后,您可以控制存根方法的核心,并决定应该在内存中记录哪些内容以供以后检索/断言,以及应该简单地忽略哪些内容。
因为这些方法是#protected
,所以 Moq 不会对此感到高兴;对于一个纯粹的 Moq'ist 来说,这可能会感到痛苦或丑陋,但是,在这种情况下,您只谈论一个假类,它会与您的 Moqs 很好地共存。此外,它允许您将测试与 SUT 隔离而忽略方面,因此它有助于将测试范围缩小到您关心的类和行为。
将该存根或假类存储在与您的测试相同的项目中,然后配置您的 DI 以在测试运行时实例化您的存根,而不是您的真实方面。PostSharp 仍将在编译时正确注入您的 SUT,如果您对存根进行编码,断言仍应成功