3

Visual Studio 独自の [単体テストの作成...] オプションを使用して、プライベート メソッドで単体テストを生成しました。

うまくいきましたが、今コードをチェックインしようとすると、ビルドに必要な AppData/Local/Temp にプライベート アクセサー クラスが VS によって作成されているため、ビルドが中断されます。このファイルをソース ツリーに配置しようとすると、コンパイラが「本体を定義する必要がある」と言うため、コンパイルされません。この反射ひばりは本当に理解できません...

これはアクセサ クラスです。

#region Assembly AgentConfiguration_Accessor.exe, v4.0.30319
// C:\Projects\AgentConfigurationTests\obj\Debug\AgentConfiguration_Accessor.exe
#endregion

using Agent.ConfigurationData;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace Agent.AgentConfiguration
{
    [Shadowing("Agent.AgentConfiguration.AgentConfigurationGui")]
    public class AgentConfigurationGui_Accessor : BaseShadow
    {
        protected static PrivateType m_privateType;

        [Shadowing(".ctor@0")]
        public AgentConfigurationGui_Accessor();
        public AgentConfigurationGui_Accessor(PrivateObject value);

        [Shadowing("_agentPaths")]
        public AgentPaths _agentPaths { get; }
        [Shadowing("_agentServiceName")]
        public static string _agentServiceName { get; set; }
        [Shadowing("UpdateStatus@1")]
        public void UpdateStatus(string statusMessage);
    }
}
4

2 に答える 2

2

プライベート アクセサーをしばらく使用した後、ソース コード バージョニング システムとの分岐とマージの後にコードをコンパイルする際に問題が発生しました。

このトピックについて調査を開始したところ、 Visual Studio Team Testブログで記事を見つけました。私が理解している限り、Private Accessor クラスはもう使用しないでください。

Generation of Private Accessors (Publicize) and Code Generation for Visual Studio 2010のブログ記事では、この機能はこれ以上サポートされていないと述べています。

Visual Studio 2010 のこれらの機能への取り組みは中止されており、次のリリースで製品から削除される可能性があります。これは、次の理由によるものです。

  • リソースと時間の不足: このリリースの焦点は、手動テスターのエクスペリエンスを向上させることでした。そのため、コード生成と公開機能の優先度は低くなりました。私たちが利用している公開機能には、対処されていない他の問題もあります。
  • 言語チームによる新機能: 言語チームがプロジェクトの種類と言語に変更を加えたため、私たちは彼らが行った変更に対応できず、彼らが導入した新機能を扱うことができませんでした。

もちろん、代わりに何ができるかについての提案があります。

内部 API のテストを継続したい場合は、次の 3 つのオプションがあります。

  1. Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject クラスを使用して、コード内の内部およびプライベート API へのアクセスを支援します。これは、Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll アセンブリにあります。
  2. コードを反映して内部またはプライベート API にアクセスできるリフレクション フレームワークを作成します。
  3. アクセスしようとしているコードが内部の場合、InternalsVisibleToAttribute を使用して API にアクセスできる場合があるため、テスト コードは内部 API にアクセスできます。
于 2012-08-08T08:23:23.307 に答える
1

私はこの機能を使用しませんが、最初に単体テストについて学び始めたときに短期間使用しました。一般に、単体テストでは、クラスのパブリック サーフェスをテストする必要があります。その原則から始めれば、アクセサー クラスは必要ないはずです。

しかし、クラスで重要なプライベート ロジックをどのようにテストするのでしょうか? 私は通常、プライベート メソッドをヘルパー クラスに抽出し、そこでパブリック メソッドにします (「単一責任の原則」と考えてください)。もちろん、パブリック メソッドとして、アクセサー クラスがなくてもテスト可能になります。元のクラスは、ヘルパー クラスのプライベート インスタンスを取得します。

このアプローチにより、テストでアクセサー クラスを回避できるだけでなく、テストでモック オブジェクトを使用しやすくなります。元のクラスをテストするときは、「実際の」ヘルパー クラスを与える代わりに、モック インスタンスを与えます。これにより、元のクラスのテストがヘルパー クラスのロジックから分離されます。ヘルパー クラスにバグを導入すると、ヘルパー クラスのテストは失敗しますが、元のクラスのテストは影響を受けません。

于 2012-08-03T08:45:10.160 に答える