web-dev-qa-db-ja.com

コンストラクターにパラメーターがある場合のMoqによるオブジェクトのモック

Moqを使用してモックしようとしているオブジェクトがあります。オブジェクトのコンストラクターには必須パラメーターがあります。

public class CustomerSyncEngine {
    public CustomerSyncEngine(ILoggingProvider loggingProvider, 
                              ICrmProvider crmProvider, 
                              ICacheProvider cacheProvider) { ... }
}

今、私はmoqのv3「setup」またはv4「Mock.Of」構文のいずれかを使用してこのオブジェクトのモックを作成しようとしていますが、これを理解できません...私がしようとしているすべてが検証されていません。ここに私がこれまで持っているものがありますが、最後の行は私にモックではなく実際のオブジェクトを与えています。これを行う理由は、確認したいCustomerSyncEngineのメソッドが呼び出されているためです...

// setup
var mockCrm = Mock.Of<ICrmProvider>(x => x.GetPickLists() == crmPickLists);
var mockCache = Mock.Of<ICacheProvider>(x => x.GetPickLists() == cachePickLists);
var mockLogger = Mock.Of<ILoggingProvider>();

// need to mock the following, not create a real class like this...
var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm, mockCache);
82
Andrew Connell

CustomerSyncEngineをモックするのではなく、新しいキーワードを使用しているため、最後の行は実際のインスタンスを示しています。

Mock.Of<CustomerSyncEngine>()を使用する必要があります

Mocking Concrete型の唯一の問題は、Moqがパブリックのデフォルトコンストラクター(パラメーターなし)ORコンストラクターarg仕様でMoqを作成する必要があることです。 http:// www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html

最善の方法は、クラスを右クリックして[抽出]インターフェースを選択することです。

31
Raghu

最後の行を

var syncEngine = new Mock<CustomerSyncEngine>(mockLogger, mockCrm, mockCache).Object;

そしてそれは動作するはずです

58
Suhas