使用泛型进行测试
本文关键字:测试 泛型 | 更新日期: 2023-09-27 18:18:21
尽管我在谷歌上搜索了很多,但我似乎找不到合适的场景。我不熟悉测试/单元测试/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);
}
}
为了使它对测试更友好,我将其更改为Interface;
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。我失去了如何重新安排/重构代码,以得到这个工作虽然。
您正在测试AssetManager
,因此模拟它可能不是一个好主意。你想要模拟的东西是AssetManager依赖于,而不是AssetManager本身。
像这样写你的测试:
DisconnectedBindingList<Change, TestContext> data = ...
var am = new AssetManager();
am.ChangeList = data;
Assert.IsTrue(am.IsChangeValid(new Change{idChange = 2}));
如果AssetManager依赖于某些东西(例如,它从数据库中读取),您想要模拟该组件用于此测试。