Я использую Django и Neo4j вместе с neomodel как OGM (ORM для графиков). Он работает хорошо, но когда дело доходит до тестирования, Neomodel не поддерживает обычное поведение Django с реляционными базами данных. Я имею в виду, что он не создает временный экземпляр Neo4j, который создается в начале тестирования и уничтожается после его завершения.Neo4j и Django тестирование
Я делал некоторые исследования, и я нашел два возможных решения:
Во-первых, это создание пользовательских DISCOVER бегун, где вы остановить базу данных разработки, а затем запустить тестовую базу данных из другого путь, запустить ваши тесты и, наконец, остановить экземпляр теста и снова запустить экземпляр разработки. Это решение предлагается в потоке Django testing of neo4j database. Следующий код был адаптирован для 3.1.1 версии Neo4j:
from time import sleep from subprocess import call from django.test.runner import DiscoverRunner from py2neo import authenticate class DiscoverRunner(DiscoverRunner): def setup_databases(self, *args, **kwargs): # Stop your development instance call("sudo neo4j stop", shell=True) # Sleep to ensure the service has completely stopped sleep(1) # Start your test instance (see section below for more details) success = call("neo4j_test/neo4j-community-3.1.1/bin/neo4j" " start", shell=True) # Need to sleep to wait for the test instance to completely come up sleep(10) if success != 0: return False # These lines have been commented because I've set the configuration # dbms.security.auth_enabled=false #try: # # For neo4j 2.2.x you'll need to set a password or deactivate auth # # Nigel Small's py2neo gives us an easy way to accomplish this # # call("source /path/to/virtualenv/bin/activate && " # # "/path/to/virtualenv/bin/neoauth " # # "neo4j neo4j my-p4ssword") # authenticate("localhost:7474", "neo4j", "my-password") #except OSError: # pass # Don't import neomodel until we get here because we need to wait # for the new db to be spawned from neomodel import db # Delete all previous entries in the db prior to running tests query = "match (n)-[r]-() delete n,r" db.cypher_query(query) super(DiscoverRunner, self).__init__(*args, **kwargs) def teardown_databases(self, old_config, **kwargs): from neomodel import db # Delete all previous entries in the db after running tests query = "match (n)-[r]-() delete n,r" db.cypher_query(query) sleep(1) # Shut down test neo4j instance success = call("neo4j_test/neo4j-community-3.1.1/bin/neo4j" " stop", shell=True) if success != 0: return False sleep(1) # start back up development instance call("sudo neo4j start", shell=True)
Он отлично работает, пока он не пытается подключиться к тестовой базе данных и сделать запрос, поскольку он использует соединение шифрует и смотрит в
'~/.neo4/known_hosts'
для подключения ключа, но он конфликтует с одним из базы данных разработки и аварией со следующей ошибкой:neo4j.v1.exceptions.ProtocolError: Server certificate does not match known certificate for 'localhost'; check details in file '~/.neo4j/known_hosts'
Итак, есть ли способ избежать этой проверки сертификации?
Второе решение создает тот же маршрут поиска и создает базу данных ImpermanentDatabase, доступную в Neo4j. Проблема в том, что вся информация, которую я нашел, находится в Java exceot this, Neo4j ImpermanentDatabase in python unittests, и это не дает мне понять, как реализовать это в python. Есть ли кто-то имеет некоторое представление о том, как использовать его в питон (это не имеет значения, если это с neomodel, py2neo или даже непосредственно с драйвером питона)
Спасибо очень много заранее.