如何模拟 gremlin 服务器或为单元测试创​​建内存图?

How to mock a gremlin server or create in-memory graph for unit testing?

我正在使用 Gremlin.Net,我想为查询数据库的函数编写单元测试。我希望查询 运行 模拟数据,以查看结果是否正确转换为我想要的格式,尤其是 Traverser.Object 具有 dynamic 类型。

有什么办法可以做到这一点吗?也许 运行 代码中的服务器或具有图形的内存实例。

这是一个玩具示例:

var query = graphTraversalSource.V(leafIds).As("leaf")
                .Emit(__.HasLabel("root"))
                .As("root")
                .Repeat(
                    __.InE("related_to").OtherV()
                    .SimplePath())
                .Dedup()
                .Select<Vertex>("leaf", "root")
                .By(__.ValueMap<string, string>(true));

var res = new List<MyFormat>();
foreach (var t in query.Traversers)
{
    var leafInfo = t.Object["leaf"];
    var rootInfo = t.Object["root"];

    var tmp = new MyFormat
    {
        LeafId = leafInfo[T.Id],
        LeafLabel = leafInfo[T.Label],
        LeafProperty = leafInfo["some_property"][0],
        RootId = rootInfo[T.Id],
        RootProperty = rootInfo["some_other_propert"][0]
    };

    res.Add(tmp);
}

return res;

在上面的示例中,leafInforootInfo 具有 dynamic 类型,因此针对测试图使用此函数 运行 可以断言这些变量已正确使用,例如leafInfo["some_property"][0] 可分配给 MyFormat.LeafProperty

我不确定是否有在 .NET 应用程序中模拟 Gremlin 服务器的好方法。我想您可以尝试编写 IRemoteConnection 的某种实现并将其提供为:

var g = Traversal().WithRemote(new MyRemoteConnection());

但根据您希望测试的内容和希望的方式,完成它可能并非易事。

我想说的是,.NET(和其他非 JVM 语言)开发人员通常将 Gremlin Server 与 Docker 结合使用。在单元测试开始之前启动它(使用 TinkerGraph 进行快速但可能不是完美的测试)并在它们结束时将其关闭。我想这不是经典意义上的真正 "unit test" ,但它可以工作并且速度很快。我们在 TinkerPop 中为 .NET 以及其他 GLV 使用的单元测试正是采用了这种方法。我们与 Maven 集成并通过其标准生命周期将 Gremlin 服务器配置为 start/stop。该配置的主要部分可以在 here.

中找到

如果我们能更好地测试对 .NET 等 GLV 的支持,那就太好了,但是当我结束这个答案时,我想知道你是否不能用 IRemoteConnection 做一些巧妙的事情。也许如果有更好的测试支持,它会以某种方式从那个界面出来。