0

我有一个像下面这样的类:

[Log]
public class SomeClass
{  }

来自LogAttributePostSharp OnMethodBoundaryAspect。我希望将所有实例LogAttribute换成不做任何事情的方面的一些伪造/模拟版本,以便我可以SomeClass独立于方面代码运行进行单元测试。在集成测试期间,我将让方面正常运行。有谁知道如何实现类似的东西?

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

谢谢!

4

2 回答 2

2

请参阅此问题如何在运行单元测试时禁用 PostSharp?

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

于 2014-04-01T15:26:17.230 回答
0

如果您的日志记录方面有点遵循 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,如果您对存根进行编码,断言仍应成功

于 2014-04-03T03:45:48.170 回答