web-dev-qa-db-ja.com

Moqを使用してコンストラクターをモックしますか?

私はそのようなコンストラクタのセットを持っています:

public BusinessObjectContext()
         : this(CloudStorageAccount.FromConfigurationSetting("DataConnectionString").TableEndpoint.ToString(),
                CloudStorageAccount.FromConfigurationSetting("DataConnectionString").Credentials) {}

public BusinessObjectContext(string dataConnectionString)
         : this(CloudStorageAccount.Parse(dataConnectionString).TableEndpoint.ToString(),
                CloudStorageAccount.Parse(dataConnectionString).Credentials) { }

public BusinessObjectContext(String baseAddress, StorageCredentials credentials) 
         : base(baseAddress, credentials) { } 

ただし、テスト/モッキングするときは、接続文字列パラメータのないオブジェクトが必要です。どうすればこれを行うことができます-Moqが望ましいですか?

これはまったく可能ですか?

26

コードの匂いがあるように聞こえます- コンストラクターがあまりにも多くの作業を行っている 。この記事には、このようなシナリオに対する一連の修正が含まれています。基本的には、答えはonlyコンストラクタで割り当てを実行することであり、ビジネスロジックを実行しないことです。

19
Finglas
var myMockBOC = new Mock<BusinessObjectContext>(null, null);

これにより、2つのパラメーターにnullが渡されます。

別のアプローチは、テストでの使用のみを目的とした内部コンストラクターを作成し、 InternalsVisibleTo を使用して、テストアセンブリで使用できるようにすることです。残念ながら、これには大きな欠点があります。アセンブリに署名した場合、 Moqはコンストラクターを使用できません です。これはMoqの4.0リリースで対処されることになっています。

31
womp

コンストラクターパラメーターを使用したくない場合は、モックするときにIt.IsAny()メソッドで渡すことができます。 null値が渡されます。 nullを書き込む代わりにこのメソッドを使用すると、はるかに読みやすくなります。

2
Kemal Cankurt