Как выполнить юнит-тестирование с использованием Neo4JClient - PullRequest
0 голосов
/ 01 марта 2019

Я работал над реализацией .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 по этому вопросу.

1 Ответ

0 голосов
/ 01 марта 2019

Свободные 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 { }
}
...