2015-10-20 34 views
0

儘管重要的谷歌搜索,我似乎無法找到正在嘗試執行的操作。我是新來的測試/單元測試/ TDD等使用泛型進行測試

我有以下類;

public class AssetManager 
{ 
    public DisconnectedBindingList<Change, AssetContext> ChangeList {get; private set;} 

    public AssetManager() 
    { 
     ChangeList = new DisconnectedBindingList<Change, AssetContext>(); 
    } 

    public bool IsChangeValid(Change newChange) 
    { 
     return ChangeList.Any(c => c.idChange == newChange.idChange); 
    } 
} 

爲了使測試更友好,我更改了接口;

public interface IAssetManager<TContext> where TContext : DbContext, new() 
{ 
    DisconnectedBindingList<Change, TContext> ChangeList {get; set;} 

    bool IsChangeValid(Change newChange); 
} 

public class AssetManager<TContext> : IAssetManager<TContext> where TContext : DbContext, new() 
{ ... } 

顯然有一些 DisconnectedBindingList<T,TContext>本質上是一個本地緩存。 TContext僅在初始化/刷新期間需要,這就是爲什麼它不被傳遞/存儲在DisconnectedBindingList中。

雖然這仍然不能幫助我進行測試。

我有我的測試設置如下;

DisconnectedBindingList<Change, TestContext> data = ... 
Mock<IAssetManager<TestContext>> mockRepo = new Mock<IAssetManager<TestContext>>(); 
mockRepo.SetupGet(x => x.ChangeList).Returns(data); 
Assert.IsTrue(mockRepo.Object.IsChangeValid(new Change{idChange = 2})); 

其中TestContext只是;

public class TestContext : DbContext {} 

我只是不太確定它在哪裏掉下來。看起來像AssetManager.IsChangeValid()方法沒有被調用,這是有道理的,因爲我沒有初始化一個AssetManager,只有一個IAssetManager。我失去了如何重新安排/重構代碼來實現這個目標。

回答

0

您正在測試AssetManager,所以嘲笑它可能不是一個好主意。 您想模擬AssetManager依賴於而不是AssetManager自身的東西。

編寫測試是這樣的:

DisconnectedBindingList<Change, TestContext> data = ... 
var am = new AssetManager(); 
am.ChangeList = data; 
Assert.IsTrue(am.IsChangeValid(new Change{idChange = 2})); 

如果AssetManager要看的東西(比方說,例如,從數據庫中讀取),你要嘲笑組件進行此測試。

+0

是的,ChangeList是私人設置,所以雖然我明白你在做什麼,但在這種情況下它不起作用。 – Trent

+0

@FizzBu​​zz在這種情況下,你需要改變它抓取數據的方式。既可以將其作爲構造函數參數,也可以模擬提供數據的組件。 (例如,如果'ChangeList'來自數據庫,則模擬出數據庫服務,並使其返回'data') – Rob

+0

或者,您可以調用'.ChangeList.Clear();'和'ChangeList.AddRange數據);',假設集合允許(我不熟悉'DisconnectedBindingList <,>') – Rob