C# 如何使用Neo4JClient进行单元测试方法

C# 如何使用Neo4JClient进行单元测试方法,c#,unit-testing,neo4j,.net-core,neo4jclient,C#,Unit Testing,Neo4j,.net Core,Neo4jclient,我一直致力于实现一个.NET核心API,使用Neo4J作为数据存储,使用Neo4JClient()构建应用程序的数据层。事情进展得很顺利,但我不知道如何使用客户机测试方法,以充分验证代码是否达到预期效果 使用Neo4JClient的示例方法: private readonly IGraphClient _graphClient; protected IGraphClient GraphClient => _graphClient; public BaseRepository(GraphC

我一直致力于实现一个.NET核心API,使用Neo4J作为数据存储,使用Neo4JClient()构建应用程序的数据层。事情进展得很顺利,但我不知道如何使用客户机测试方法,以充分验证代码是否达到预期效果

使用Neo4JClient的示例方法:

private readonly IGraphClient _graphClient;
protected IGraphClient GraphClient => _graphClient;

public BaseRepository(GraphClient client)
{
    _graphClient = client;
    _graphClient.Connect();
}

public async Task<IList<TModel>> GetAllAsync()
{
    var results = await GraphClient.Cypher.Match($"(e:{typeof(TModel).Name})")
        .Return(e => e.As<TModel>())
        .ResultsAsync;
    return results.ToList();
}
专用只读IGraphClient\u graphClient;
受保护的IGraphClient GraphClient=>\u GraphClient;
公共BaseRepository(GraphClient客户端)
{
_graphClient=客户机;
_graphClient.Connect();
}
公共异步任务GetAllAsync()
{
var results=await GraphClient.Cypher.Match($“(e:{typeof(TModel.Name})”)
.Return(e=>e.As())
.ResultsAsync;
返回结果。ToList();
}

是否有在
GraphClient
上运行的模拟和单元测试方法的现有文档?我在谷歌搜索中找不到关于这个主题的任何东西。

流畅的API似乎是个好主意,直到有人想嘲笑他们

但是,至少Neo4JClient图形客户端是基于接口的

您可以这样做(您需要将构造函数参数更改为
IGraphClient
,而不是
GraphClient

public class BaseRepositoryTests
{
    private readonly BaseRepository<Model> subject;
    private readonly Mock<ICypherFluentQuery> mockCypher;
    private readonly Mock<ICypherFluentQuery> mockMatch;
    private readonly Mock<IGraphClient> mockGraphClient;

    public BaseRepositoryTests()
    {
        mockMatch = new Mock<ICypherFluentQuery>();

        mockCypher = new Mock<ICypherFluentQuery>();
        mockCypher
            .Setup(x => x.Match(It.IsAny<string[]>()))
            .Returns(mockMatch.Object);

        mockGraphClient = new Mock<IGraphClient>();
        mockGraphClient
            .Setup(x => x.Cypher)
            .Returns(mockCypher.Object);

        subject = new BaseRepository<Model>(mockGraphClient.Object);
    }

    [Fact]
    public async Task CanGetAll()
    {
        IEnumerable<Model> mockReturnsResult = new List<Model> { new Model() };

        var mockReturn = new Mock<ICypherFluentQuery<Model>>();

        mockMatch
            .Setup(x => x.Return(It.IsAny<Expression<Func<ICypherResultItem, Model>>>()))
            .Returns(mockReturn.Object);

        mockReturn
            .Setup(x => x.ResultsAsync)
            .Returns(Task.FromResult(mockReturnsResult));

        var result = await subject.GetAllAsync();

        Assert.Single(result);
    }

    public class Model { }
}
公共类BaseRepositoryTests
{
私有只读数据库主题;
私有只读模拟仿真器;
私有只读模拟模拟匹配;
私有只读模拟mockGraphClient;
公共数据库存储测试()
{
mockMatch=新Mock();
mockCypher=新Mock();
嘲弄者
.Setup(x=>x.Match(It.IsAny()))
.Returns(mockMatch.Object);
mockGraphClient=newmock();
模拟图形客户端
.Setup(x=>x.Cypher)
.Returns(mockCypher.Object);
主题=新的BaseRepository(mockGraphClient.Object);
}
[事实]
公共异步任务CanGetAll()
{
IEnumerable mockReturnsResult=新列表{new Model()};
var mockReturn=new Mock();
模拟比赛
.Setup(x=>x.Return(It.IsAny()))
.Returns(mockReturn.Object);
模拟返回
.Setup(x=>x.ResultsAsync)
.Returns(Task.FromResult(mockReturnsResult));
var result=await subject.GetAllAsync();
单一(结果);
}
公共类模型{}
}

这很有帮助,谢谢!你说得对,流畅的接口让这变得更难。不幸的是,不管我做什么,我最终都会进行单元测试,我只是复制了所有现有的逻辑。哦,好吧,我想,我仍然捕获了回归。谢谢你的建议/示例代码!:)