使用泛型进行测试

本文关键字:测试 泛型 | 更新日期: 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依赖于某些东西(例如,它从数据库中读取),您想要模拟组件用于此测试。