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。我失去了如何重新安排/重構代碼來實現這個目標。
是的,ChangeList是私人設置,所以雖然我明白你在做什麼,但在這種情況下它不起作用。 – Trent
@FizzBuzz在這種情況下,你需要改變它抓取數據的方式。既可以將其作爲構造函數參數,也可以模擬提供數據的組件。 (例如,如果'ChangeList'來自數據庫,則模擬出數據庫服務,並使其返回'data') – Rob
或者,您可以調用'.ChangeList.Clear();'和'ChangeList.AddRange數據);',假設集合允許(我不熟悉'DisconnectedBindingList <,>') – Rob