2

在 .net 项目中有很多用 c# 实现的实体。使用的库(saga 实体的 nservicebus)的要求是所有访问方法都必须声明为公共和虚拟的,否则在部署过程中会失败。

在单元测试阶段检查实体的访问方法是否是虚拟的是合理的,部署可能需要很长时间(在它被发现之前)

有谁知道检查类中的所有公共方法是否在 nunit 测试中声明为虚拟的好方法?

4

4 回答 4

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

}
于 2013-01-16T12:40:50.970 回答
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);
    }
}
于 2013-01-16T12:40:34.140 回答
1

你也可以使用像Fody/Virtuosity这样的工具来为你完成这项工作:)

于 2013-01-16T23:54:33.140 回答
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);    
}
于 2013-01-16T12:48:14.763 回答