繁体   English   中英

泛型测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM