C# 使用泛型进行测试

C# 使用泛型进行测试,c#,unit-testing,generics,C#,Unit Testing,Generics,尽管谷歌对我进行了重大调整,但我似乎找不到合适的方案。我不熟悉测试/单元测试/tdd等 我有以下课程 public class AssetManager { public DisconnectedBindingList<Change, AssetContext> ChangeList {get; private set;} public AssetManager() { ChangeList = new DisconnectedBinding

尽管谷歌对我进行了重大调整,但我似乎找不到合适的方案。我不熟悉测试/单元测试/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);
    }
}
TestContext只是一个例子

我只是不太确定它到底掉到哪里去了。似乎没有调用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依赖于某个东西,例如,它从数据库中读取数据,那么您需要模拟该组件进行此测试。

是的,更改列表是私有设置的,所以虽然我确实理解您的意思,但在这种情况下它不太起作用。@FizzBuzz在这种情况下,您需要更改它获取数据的方式。要么允许它作为构造函数参数,要么模拟提供数据的组件。例如,如果ChangeList来自数据库,模拟数据库服务,并使其返回数据。或者,您可以调用.ChangeList.Clear;和ChangeList.AddRangedata;,假设集合允许我不熟悉DisconnectedBindingListYeah,这是一个问题。它基本上是一个BindingList,并且没有标记为readonly,所以我可以使用clear/add。这样运行测试可以吗?我想我是在测试ischangefalid,而不是数据库查询,所以这样做似乎是合理的。我认为这很好。您的测试是测试IsChangeValid,并且测试应该彼此独立,因此完全删除数据应该包含的内容并用实际测试的内容替换它是完全有效的。
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}));
public class TestContext : DbContext {}
DisconnectedBindingList<Change, TestContext> data = ...
var am = new AssetManager();
am.ChangeList = data;
Assert.IsTrue(am.IsChangeValid(new Change{idChange = 2}));