![](/img/trans.png)
[英]Function for automated testing of multi-parameter methods; using delegates and generics
[英]Testing with Generics
尽管有大量的google-ing,但我似乎找不到合适的方案来做我想做的事情。 我是测试/单元测试/ 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。 我迷失了如何重新安排/重构代码以使其正常工作。
您正在测试AssetManager
,因此模拟它可能不是一个好主意。 您想模拟AssetManager依赖的东西,而不是AssetManager本身。
像这样编写测试:
DisconnectedBindingList<Change, TestContext> data = ...
var am = new AssetManager();
am.ChangeList = data;
Assert.IsTrue(am.IsChangeValid(new Change{idChange = 2}));
如果AssetManager依赖某种东西(例如,它从数据库中读取),则您想对该组件进行模拟以进行此测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.