2015-10-20 43 views
2

我已經創建了一些抽象方法的抽象基類叫做:驗證,如果一個抽象的方法是使用最小起訂量

public abstract class MyBaseClass<T> where T: class, IEntity 
{ 

    public T Load(long id) 
    { 
    //if in cache continue with cached value 
    //else make use of protected abstract LoadFromContext 
    } 

    protected abstract T LoadFromContext(long id); 
} 

現在我要檢查,如果LoadFromContext我們調用,但我得到一個錯誤:System.ArgumentException :成員FakeCacheRepository.LoadFromContext不存在

單元測試Moq的Setup其中FakeCacheRepository是派生型的MyBaseClass:

Mock<FakeCacheRepository> personRepoMock = new Mock<FakeCacheRepository>(); 
personRepoMock.Setup(x => x.Load(14)).Returns(new Person() { ID = 14, Name = "Developer14" }); 
personRepoMock.Protected().Setup("LoadFromContext"); 

var person = new FakeCacheRepository().Load(14); 

Assert.AreEqual("Developer14", person.Name); 
personRepoMock.Protected().Verify("LoadFromContext", Times.Once()); 

我做錯了什麼,是否有任何關於moq的好教程,以便更好地理解,而不必去Google提出每個問題。

回答

3

您設置的模擬對象personRepoMock似乎沒有被FakeCacheRepository對象person使用。所以你的設置和驗證不被使用。

但是,我不認爲這是測試這個的正確方法,我只是在不嘲笑的情況下測試FakeCacheRepository類。從外部看,FakeCacheRepository繼承自MyBaseClass並不重要,因此只需測試FakeCacheRepository公開的方法。

如果您想要在多個類之間共享代碼,請將該代碼提取到單獨的類中 - 繼承不應該用於共享代碼。

+0

嗨湯姆,不想在這裏開始討論如何構建代碼。在代碼應該被提取時,我應該如何繼承代碼,哪裏可以找到指導原則?這裏討論的基類正式名稱爲「CachedRepositoryBase」...所有緩存內容都放在這裏。只有連接特定的東西放在繼承的類中,仍然是緩存的存儲庫類(如此繼承)。目前這似乎對我而言是合法的。 –

+0

我沒有任何特定的發送鏈接,但Google的一句「編寫可測試代碼」的短語引出了不少可能引起您關注的文章。 – TomDoesCode

4

除了什麼TomDoesCode已經說過:

要使用Protected()你的方式,你必須使用通用的版本,因爲LoadFromContext返回一個值(Person)。此外,你必須傳遞參數:

personRepoMock.Protected().Setup<Person>("LoadFromContext", 14L); 

同樣,你Verify有看起來像

personRepoMock.Protected().Verify<Person>("LoadFromContext", Times.Once(), 14L); 

但是,即使你會改變這種狀況,你的測試是行不通的。你創建一個FakeCacheRepository的模擬,但是然後在FakeCacheRepository的新實例上調用Load(14),而不是在模擬上。

你應該退後一步,想想你想要測試的是什麼。如果你想測試FakeCacheRepository是否從Load調用LoadFromContext,那麼moq不是適合這項工作的工具。

+0

如果從Load調用「LoadFromContext」,測試還有其他什麼選項?除手動調試外。我是單元測試新手,但我看到了可能性和優勢。當知道測試是正確的方法時,不想停止。 –

+0

如果你真的想測試一下,你可以創建一個'MyBaseClass'的子類,它簡單地在'LoadFromContext'中設置一個標誌,並在調用'Load'後檢查該標誌是否用簡單的'Assert'設置。如果您現在將您在代碼中寫入的緩存抽象出來,那麼您還可以測試在使用緩存的情況下是否調用了「LoadFromContext」。 – sloth

相關問題