2

.net プロジェクトには、C# で実装された多くのエンティティがあります。使用するライブラリ (サガ エンティティの nservicebus) の要件は、すべてのアクセス メソッドを public および virtual として宣言することです。そうしないと、デプロイ プロセス中に失敗します。

エンティティのアクセス方法が単体テスト段階で仮想であることを確認することは合理的です.sa 展開には(発見される前に)多くの時間がかかる可能性があります.

クラス内のすべてのパブリック メソッドが 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 に答える