使用PostSharp进行适当的单元测试

时间:2014-06-17 17:59:25

标签: c# unit-testing aop postsharp

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

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

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

2 个答案:

答案 0 :(得分:3)

回答你的“这是一个好主意吗?”,我认为非常重要。

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 )));
}

答案 1 :(得分:1)

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

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

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