5

私は現在、VisualStudioで記述された標準の単体テストを最終的に実行する単体テストフレームワークを作成しています。フレームワークは現在、アクセサーで正しく機能していません。次のテスト方法を検討してください。

[TestMethod()]
public void TestMethod()
{
      ExampleMethods_Accessor target = null;
      target = new ExampleMethods_Accessor();
      target.SomeMethod();
}

この例では、アクセサーはVisualStudioによって生成されています。Visual Studioの単体テスト環境を使用して実行すると、単体テストは完全に正常に機能します。ただし、フレームワーク内からTestMethod()を呼び出したいと思います。「target=new ExampleMethods_Accessor()」の行で、次の例外がスローされます。

「Proband.ExampleMethods_Accessor」の型初期化子は例外をスローしました。

内部例外:

ファイルまたはアセンブリを読み込めませんでした:Proband、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null .. ..

Microsoftユニットテストフレームワークがユニットテストを呼び出す方法について誰かが考えていますか?TestContextオブジェクトがないことが原因かもしれないと思っていました。私の場合、これは「null」です。Visual Studioで単体テストを開始すると、TestContextオブジェクトには多くの情報が含まれます。正しく初期化する必要があるのでしょうか?どのように初期化する必要がありますか?

すべての助けをありがとう、クリスチャン

編集:

私はアクセサーがどのように機能しているかを実験し続けました。ILSpyを使用して、Proband_Accessor.dllに生成されているコードを確認しました。例外の原因となっている命令は次のとおりです。

SomeClass_Accessor.m_privateType = new PrivateType("Probant, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Probant.SomeClass");

ユニットテストコードを次のように変更しました(テスト用):

    [TestMethod()]
    [DeploymentItem("Proband.dll")]
    public void SomeMethodTest()
    {
        ExampleMethods_Accessor target = null;
        ExampleMethods c = null;

        try
        {
            Assembly.Load("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); // this works fine
            PrivateType tx = new PrivateType(typeof(ExampleMethods)); // this works fine as well (also without loading the assembly)

            PrivateType t = new PrivateType("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Proband.ExampleMethods"); // this causes the exception

            c = new ExampleMethods(); // this works fine
            target = new ExampleMethods_Accessor(); // this causes the exception as well
        }
        catch (Exception ex)
        {
            Console.WriteLine();
        }
        int actual;
        actual = target.SomeMethod();
    }

「newPrivateType( "Proband、Version ...."」が機能しない理由がよくわかりません。誰かアイデアはありますか?

4

3 に答える 3

1

この問題の回避策を作成することができました。

私の AppDomain に、AssemblyResolveEventHandler を追加しています。

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

このイベント ハンドラーには、次のコードが含まれています。

    private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
    {
        if(args.Name == "Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
        {
            // resolving correct assembly of type under test
            return typeof(ExampleMethods).Assembly;
        }
        else
        {
            return null;
        }
    }

コード行「target = new ExampleMethods_Accessor();」正常に動作し、正しいアクセサ オブジェクトを返します。

アセンブリを自動的に解決できない理由はまだわかりません。

誰かが同じ問題を抱えている可能性が非常に低い場合でも、この回答が誰かの役に立てば幸いです:)

于 2011-10-11T10:44:06.760 に答える
0

私はそれほど複雑なことはしていませんが、次のことがありました。

  1. .NET 3.5 を使用した Web アプリケーション プロジェクト
  2. .NET 3.5 を使用した構成プロジェクト
  3. .NET 3.5 を使用してプロジェクトをテストする

アクセサーを使用して単体テストを実行しようとすると、同じ BadImageFormat 例外が発生しました。

次のリンクを見つけました。

http://connect.microsoft.com/VisualStudio/feedback/details/677203/even-after-installing-vs2010-sp1-unit-tests-targeting-3-5-framework-fail-if-they-are-using-プライベートアクセサ#詳細

2番目の回避策で問題が解決しました。テスト プロジェクトを .NET 4.0 を対象とするように変更したところ、うまくいきました。

于 2012-03-15T16:17:12.713 に答える
0

私はまさにこの問題を抱えていました。それはDeploymentItem、テストメソッドから属性を削除したためです。もう一度追加すると、ビルド マシンでエラーが発生しなくなりました。

[TestMethod]
[DeploymentItem("FedImportServer.dll")]  // ** This is necessary for the build machine. **
public void SourceFileStillExistsAfterProcessingFails()

注:ローカルで実行してもエラーは発生しませんでした。

これはエラーです:

Test method FedImportTests.FedImportServiceHostTest.FileNoLongerExistsAfterSucessfulProcessing threw exception: System.TypeInitializationException: The type initializer for 'FedImportServer.Processing.FileProcessor_Accessor' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'FedImportServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

于 2012-07-30T21:17:40.580 に答える