在 .net 项目中有很多用 c# 实现的实体。使用的库(saga 实体的 nservicebus)的要求是所有访问方法都必须声明为公共和虚拟的,否则在部署过程中会失败。
在单元测试阶段检查实体的访问方法是否是虚拟的是合理的,部署可能需要很长时间(在它被发现之前)
有谁知道检查类中的所有公共方法是否在 nunit 测试中声明为虚拟的好方法?
在 .net 项目中有很多用 c# 实现的实体。使用的库(saga 实体的 nservicebus)的要求是所有访问方法都必须声明为公共和虚拟的,否则在部署过程中会失败。
在单元测试阶段检查实体的访问方法是否是虚拟的是合理的,部署可能需要很长时间(在它被发现之前)
有谁知道检查类中的所有公共方法是否在 nunit 测试中声明为虚拟的好方法?
我使用相同的测试来验证,游戏引擎包装器具有所有公共方法作为虚拟。它使测试更容易,并且可以显着减少反馈时间。我将这些方法放在特殊类下DesignTests
,例如,我测试在我的项目中没有违反约定。有复杂的东西,FxCop
无法检测。你可以看到下面的代码:
[Test]
public void AllPublicMethodsInUnityFacade_ShouldBeVirtual()
{
var allPublicMethods =
typeof(UnityFacade).GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public);
Assert.IsTrue(allPublicMethods.All(method => method.IsVirtual),
string.Join(", ", allPublicMethods
.Where(method => !method.IsVirtual)
.Select(method => method.Name))
+ " is not virtual");
}
使用反射,卢克。
http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.isvirtual.aspx
using System;
using System.Reflection;
public class MyClass
{
public void MyMethod()
{
}
public static void Main()
{
MethodBase m = typeof(MyClass).GetMethod("MyMethod");
Console.WriteLine("The IsFinal property value of MyMethod is {0}.",
m.IsFinal);
Console.WriteLine("The IsVirtual property value of MyMethod is {0}.",
m.IsVirtual);
}
}
你也可以使用像Fody/Virtuosity这样的工具来为你完成这项工作:)
public static void Main()
{
MethodInfo[] methodInfos =
typeof(MyClass).GetMethods(BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.DeclaredOnly);
Console.WriteLine("The number of public methods is: {0}",
methodInfos.Length);
Int32 virtualCount = 0;
foreach (MethodInfo methodInfo in methodInfos)
{
if (methodInfo.IsVirtual)
++virtualCount;
}
if (virtualCount == methods.Length)
Console.WriteLine("All the methods are virtual!");
else
Console.WriteLine("Only {0}/{1} methods are virtual!",
virtualCount, methods.Length);
}