【问题标题】:How to unit test methods using Neo4JClient如何使用 Neo4JClient 对方法进行单元测试
【发布时间】:2019-02-28 23:25:33
【问题描述】:

我一直致力于实现一个 .NET Core API,使用 Neo4J 作为数据存储和 Neo4JClient (https://github.com/Readify/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();
}

是否有像这样在GraphClient 上运行的模拟和单元测试方法的现有文档?我无法在 Google 搜索中找到有关该主题的任何内容。

【问题讨论】:

    标签: c# unit-testing neo4j .net-core neo4jclient


    【解决方案1】:

    在有人想模拟它们之前,Fluent 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 { }
    }
    

    【讨论】:

    • 这很有帮助,谢谢!你是对的,流畅的界面让这变得更难了。不幸的是,似乎无论我做什么,我都会以那些我只是复制所有现有逻辑的单元测试结束。哦,好吧 - 我猜仍然会出现回归。感谢您的建议/示例代码! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多