【问题标题】:Proper unit testing with PostSharp [closed]使用 PostSharp 进行适当的单元测试 [关闭]
【发布时间】:2015-01-07 03:37:09
【问题描述】:

对使用 PostSharp 方面的类进行单元测试的正确方法是什么? 示例:

class MyViewModel
{
   [AsyncOperationInformView]
   public async Task DoSmth()
   {
     ... code
   }
}

我想我可以对我的AsyncOperationInformView 方面进行单元测试,然后在MyViewModel 中添加单元测试以检查方面是否“附加”到方法DoSmth()(不测试视图模型测试中的方面逻辑)。这是有效的好方法吗?如果是这样怎么做(如何检查方面是否“附加”)?如果不是 - 为什么这是个坏主意,正确的方法是什么?

【问题讨论】:

    标签: c# unit-testing aop postsharp


    【解决方案1】:

    在回答您的“这是个好主意吗?”时,我认为非常好。

    1) 我认为您应该针对您计划发布的代码运行每个测试。如果涉及 PostSharp,那么您运行的单元测试应该针对 PostSharp 编织的程序集进行测试。否则,您将花费构建和开发时间来测试未使用的、中间的或一次性的程序集。同样的想法也适用于针对调试与发布运行自动化测试(我总是针对发布运行所有测试)。如果你有足够的构建时间,如果你真的非常想,你可以同时对抗两者。但是,如果您需要选择,测试您将部署的代码是绝对必要的。

    2) 我认为通过自动化测试来确认每个“规则”是个好主意。如果您要求每个方法都使用方面进行修饰,请编写一个自动化测试来确认每个方法都使用该方面进行修饰。对程序集运行基于反射的自动测试相对于发现错误、追踪有问题的函数、然后在两年后发现有人忘记遵守规则的潜在成本非常便宜。

    回答“你是怎么做到的?”作为您问题的一部分,我刚刚解决了一个类似的问题,以确定一个类是否装饰有特定的 PostSharp 方面。 Stackoverflow 问题/答案是here

    解决这个问题的一个简单方法是用 MulticastAttributeUsage 装饰你的 Aspect:

    [Serializable]
    [MulticastAttributeUsage(PersistMetaData = true)]
    public class MyMethodAspectAttribute : OnMethodBoundaryAspect
    {
    }
    

    当您在方法上使用方面时,它会在您的程序集中发出一个 System.Attribute 并将其添加到您方法的自定义属性中。从那里,您可以在单元测试中简单地查询该自定义属性:

    [Test]
    public void ConfirmAspectAttached()
    {
       var serviceType = typeof( MyViewModel );
       var member = serviceType.GetMembers().Where( member.Name == "DoSmth" ).FirstOrDefault(); // probably a better way of doing this
    
       Assert.IsNotNull( member );
    
       Assert.IsTrue( member.GetCustomAttributes(true).Any(attrib => attrib.GetType() == typeof(MyMethodAspectAttribute )));
    }
    

    【讨论】:

      【解决方案2】:

      我打算使用 PostsSharp 并且有同样的想法。

      对于单元测试,您需要在没有 PostSharp 的情况下进行构建,然后使用 PostSharp 编织进行验收测试。

      如果合适,您可以断言注释 AsyncOperationInformView 存在,但不要测试它的行为,因为这是更高级别测试的责任。

      【讨论】:

      • 我认为区分不同测试点的“后锐化”和“非后锐化”代码是个坏主意。我强烈建议您针对最终(后锐化)代码运行所有测试;否则,您将无法从自动化测试工具中获得所有价值。它还给你错误的信心:单元测试可以通过,“真实”代码中可能存在重大问题。
      • @mcating 单元测试和集成\验收测试之间存在根本区别。非 PostSharp 构建的单元测试与调试构建的单元测试没有什么不同。显然,验收测试需要在 release\PostSharped 构建上进行。 Fex 正在查看他的问题中的单元测试。
      • BanksySan - 当然我可以在没有 PostSharp 的情况下构建,但我会丢失“测试用例”并且可能会错过重要的测试 - 你有什么解决方案吗?
      • @fex 你不会,如果你是单元测试的话。单元测试将断言单个单元的功能将起作用。您不是在测试 PostSharp 是否有效,只测试您编写的代码,并且只测试隔离(类大小)块中的代码。
      • @fex 如果您正在测试您的方面是否会在您运行您的方法时触发,那么这是集成\接受\联合测试(它的名称取决于您的测试策略)。在这种情况下,您需要打开 PostSharp,但您没有嘲笑,所以不再担心。您现在正在测试应用程序界面的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多