4

私の単体テストフレームワークは、TestFixtures、TestMethods、およびActionsで構成されています。アクションはTestMethod内の追加の小さなコンテナーであり、アクションは当社で作成された内部DLLから取得されます。アクションは、次のようなメソッド内で使用されます。

[Test]
void TestMethod1()
{
    Run(new Sleep { Seconds = 10 } );
}

DLLからフィクスチャ、テスト、アクションに関するすべての情報を収集するアプリケーションを作成する必要があります。タイプ/メソッド属性を使用したリフレクションによってテストフィクスチャとテストメソッドを列挙する方法を見つけました。

しかし、テストメソッド内のアクションをどのように列挙するのかわかりません。

手伝ってもらえますか?リフレクションを使ってできるのでしょうか?

更新: 承認された回答を参照してください。本当にクールなライブラリ。また、フィクスチャ、テスト、アクションのエンティティモデルを作成し、MVVMでTreeViewにバインドする方法に興味がある場合は、ここ(WPF:MVVMでTreeViewをバインドするステップバイステップのチュートリアル)を参照してください。

4

3 に答える 3

3

はい。

リフレクションは、メソッド本体を読み取り、必要な情報を取得するためにILを分解する必要があるよりも、メソッド本体を提供します。

var bytes = mi.GetMethodBody().GetILAsByteArray();

分解するための可能なツールの1つはCecilです

その他のリンクについては、トラバースac#メソッドを確認し、メソッド本体をanazlyeしてください。

于 2012-12-03T08:06:12.917 に答える
0

リフレクションを使用する代わりに、すべてのアクションの実行をログに記録する独自のメソッドを展開してみませんか。

void ExecuteAction(Action action)
{
   //Log TestFixture, TestMethod, Action

   //Execute actual action
}

[Test]
void TestMethod1()
{
    ExecuteAction(Run(new Sleep { Seconds = 10 } ));
}

ExecuteActionメソッドは、ベースクラスまたはヘルパークラスにすることができます

于 2012-12-03T08:09:16.953 に答える
0

ありがとう、アレクセイ・レベンコフ!最後に、私はあなたのチップを使用して解決策を見つけました。共有。あなたがしなければならない唯一のこと-> https://github.com/jbevain/mono.reflectionからMono.Reflection.dllをダウンロードして参照してください。

using System;
using System.Linq;
using System.Reflection;
using MINT;
using MbUnit.Framework;
using Mono.Reflection;

namespace TestDll
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            const string DllPath = @"d:\SprinterAutomation\Actions.Tests\bin\x86\Debug\Actions.Tests.dll";
            Assembly assembly = Assembly.LoadFrom(DllPath);

            // enumerating Fixtures
            foreach (Type fixture in assembly.GetTypes().Where(t => t.GetCustomAttributes(typeof(TestFixtureAttribute), false).Length > 0)) 
            {
                Console.WriteLine(fixture.Name);
                // enumerating Test Methods
                foreach (var testMethod in fixture.GetMethods().Where(m => m.GetCustomAttributes(typeof(TestAttribute), false).Length > 0))
                {
                    Console.WriteLine("\t" + testMethod.Name);
                    // filtering Actions
                    var instructions = testMethod.GetInstructions().Where(
                        i => i.OpCode.Name.Equals("newobj") && ((ConstructorInfo)i.Operand).DeclaringType.IsSubclassOf(typeof(BaseAction)));

                    // enumerating Actions!
                    foreach (Instruction action in instructions)
                    {
                        var constructroInfo = action.Operand as ConstructorInfo;
                        Console.WriteLine("\t\t" + constructroInfo.DeclaringType.Name);
                    }
                }
            }

        }
    }
}
于 2012-12-03T14:12:22.150 に答える