1

这是我第一次使用 Ruby on Rails 进行开发,我正在使用 Neo4j 作为数据库。我已经安装了一个测试版本,创建了一些代表节点的模型,并编写了一个基本测试以确保一切正常。测试非常简单:它获取所有用户并打印他们的姓名。

当我直接连接到测试数据库并执行 Cypher 查询以插入数据时,测试会找到数据并正确响应。但是,当我在 test/fixtures/users.yml 文件中指定数据时,它不会加载。测试只找到手动插入的数据。这是 yml 文件:

one:
  name: 'Dan'
two:
  name: 'Sam'

我究竟做错了什么?我必须启用一些设置才能将 yml 数据加载到 neo4j 中吗?

更新:neo4j 似乎与 Rails 固定装置不兼容,并且有充分的理由:该语言无法描述关系。我正在开发新的扩展语法和实现,以允许使用固定装置来测试使用 neo4j 的 Rails 应用程序。

4

1 回答 1

0

尚未将对 Rails 固定装置的支持放入neo4jgem 中。它实际上是一个我们还没有加入的 ActiveRecord 功能。首先,我建议查看 factory_girl:

https://github.com/thoughtbot/factory_girl

它提供了一个更加动态且易于维护的系统,用于在测试中定义工厂和创建对象。当然,这意味着您的测试会变慢,因为它们需要为每个测试进行数据库调用,而不是像夹具那样在开始时设置对象。

很多人进入“一种方式必须更好”的心态,并说您需要使用固定装置或工厂。我认为在一个项目中实际上两者都有空间。固定装置非常棒,尤其是对于您知道总是会在那里的物体。它们最大的问题之一是在进行测试时需要参考您的夹具文件。

在您的编辑中,您提到固定装置不支持关系。这并不完全正确。ActiveRecord 设备支持在 YAML 中定义属性,这些属性指定关联的值。在 ActiveRecord 中,关联是通过外键/连接表来管理的,但在 Neo4j 中,它们只是通过关系完成的。所以我想同样的结构会很好。如果你想解决这个问题,我会记住几件事:

在 ActiveRecord 固定装置中,您可以直接指定外键列,也可以通过它的名称指定关联并引用它的标识符,如下所示:

### in pirates.yml

reginald:
  name: Reginald the Pirate
  monkey_id: 123
  # OR
  monkey: george

### in monkeys.yml

george:
  name: George the Monkey

使用 ActiveRecord 固定装置,这些标识符实际上被散列为一个整数,然后该整数始终用于数据库中该记录的 ID。这使得设置关联变得容易。可能需要对 neo4j.rb 进行一些类似的解决方法。请注意,ActiveNode 模型具有默认uuid属性,因此可能会被覆盖,但您需要确保不会影响用户的自id_property定义定义。

于 2015-09-13T05:05:10.173 回答