在.net项目中,有很多实体在c#中实现。使用过的库(saser实体的nservicebus)的要求是所有访问方法都被声明为public和virtual,否则在部署过程中就会失效。
在单元测试阶段检查实体的访问方法是否为虚拟是合理的,s.a。部署可能需要很长时间(在它被发现之前)
有没有人知道检查类中的所有公共方法是否在nunit测试中声明为虚拟的好方法?
答案 0 :(得分:3)
我使用相同的测试来验证,游戏引擎包装器将所有公共方法都视为虚拟。它使测试更容易,并可以大大减少反馈时间。这些方法我放在特殊的类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");
}
答案 1 :(得分:1)
使用反射,卢克。
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);
}
}
答案 2 :(得分:1)
您还可以使用像Fody/Virtuosity这样的工具为您完成这项工作:)
答案 3 :(得分:0)
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);
}