2011-09-14 35 views
0

メソッドを検証しようとしているのがモック内で呼び出されていますが、呼び出されていない例外が発生し続けている理由が分かりません。次のように問題の方法は次のとおりです。Moqで呼び出されたメソッドを確認する

public class CustomerSyncEngine { 
public CustomerSyncEngine(ILoggingProvider loggingProvider, ICrmProvider crmProvider, ICacheProvider cacheProvider) { 
    Logger = loggingProvider; 
    CrmProvider = crmProvider; 
    CacheProvider = cacheProvider; 
} 
public virtual void SyncPickLists() { 
    Logger.LogBeginPicklistSync(); 

    // get all the pick lists from the local cache 
    var localCachePickLists = CacheProvider.GetPickLists().ToList(); 
    // get all the pick lists from the remote system 
    var crmPickLists = CrmProvider.GetPickLists().ToList(); 

    // build a sync plan 
    var changes = BuildPickListUpdatePlan(localCachePickLists, crmPickLists).ToList(); 

    // run the sync 
    RunPickListSync(changes); 

    Logger.LogEndPicklistSync(); 
} 
} 

が、私は、テストので、同じように書いた:

[TestMethod] 
public void TestSyncPickLists() { 
    // arrange 
    var mockCrm = new Mock<ICrmProvider>(); 
    mockCrm.Verify(x => x.GetPickLists(), Times.Once(), "ICrmProvider.GetPickLists not called"); 

    var mockCache = Mock.Of<ICacheProvider>(); 
    var mockLogger = Mock.Of<ILoggingProvider>(); 

    // act 
    var syncEngine = new CustomerSyncEngine(mockLogger, mockCrm.Object, mockCache); 
    syncEngine.SyncPickLists(); 

    // assert 
    mockCrm.VerifyAll(); 
} 

私はそれを実行すると、テストは、私が確認しに指定されたメッセージ()で失敗します。だから私はブレークポイントの束を設定し、私はテストがsyncEngine.SyncPickLists()メソッドを呼び出すことはありませんが、それは私に混乱していることがわかります。だから私は2つのVerify()& VerifyAll()ステートメントをコメントアウトして、今私はものが正しく呼び出されて参照してください。私はここで何が欠けていますか? Quickstartthis threadに表示されている内容を正確に実行しているようです。

+3

あなたは 'SyncPickLists'の呼び出しの後に' Verify'を呼び出します - 遅延したものではありません。あなたの呼び出しの下の行を 'SyncPickLists'に移動し、渡す必要があります。 – Tejs

+0

ファンタスティック...それを修正! –

答えて

0

答えはTejsによってコメントされました。

あなたは、SyncPickListsの呼び出しの後にVerifyを呼び出します。これは遅延したものではなく、値をチェックします。通話の下の行をSyncPickListsに移動すると、通る必要があります。 - Tejs

関連する問題