2016-08-10 5 views
2

Elixir Phoenix 프로젝트에서 Ecto 2.0과 MySQL을 함께 사용하고 있습니다. Ecto2.0에 따르면 documentation에 따르면 MySQL은 동시 테스트을 지원하지 않으므로 ExUnit.Case, async: true 대신에 을 사용해야 테스트가 동시에 실행되지 않습니다.Ecto 2.0 + MySQL : 테스트에서 조명 설비

필자의 테스트에서 필자는 데이터베이스에 모델을 삽입하고 테스트가 완료되면 픽스처로 삽입 된 모델은 여전히 ​​데이터베이스에 남아 있습니다 (테스트 된 코드로 삽입 된 모델 자체는 정리됩니다). Fixture에 의해 삽입 된 모델을 제거하고 싶습니다. 내가 할 경우 내가 할 경우,

** (exit) exited in: GenServer.call(#PID<0.277.0>, {:checkout, #Reference<0.0.1.1885>, true, 15000}, 5000) 
    ** (EXIT) shutdown: "owner #PID<0.276.0> exited with: shutdown" 
stacktrace: 
    (db_connection) lib/db_connection/ownership/proxy.ex:32: DBConnection.Ownership.Proxy.checkout/2 

을 :

ExUnit.Case 

setup do 
    on_exit fn -> 
    Repo.delete_all(ModelA) 
    Repo.delete_all(ModelB) 
    end 
end 

내가 얻을 :

내가 할 경우

ExUnit.Case, async: true 

setup do 
    on_exit fn -> 
    Repo.delete_all(ModelA) 
    Repo.delete_all(ModelB) 
    end 
end 

는 작동 및 고정 데이터에 청소됩니다 데이터 베이스. 그러나 모든 테스트를 실행할 때 ExUnit.Case, async: true을 지정하면 MySQl에서 동시에 테스트가 실행되기 때문에 문제가 발생합니다.

+0

어디에서 조명기를 삽입하고 있습니까? – Dogbert

+0

조명기는 테스트/지원 모듈에 정의되어 있으며 테스트 데이터베이스에 삽입됩니다. 검사는 삽입 된 조명기를 사용하고 작업하지만 자동으로 청소되지는 않습니다. – David

답변

0

일부 오류 메시지가 누락되었을 수 있습니다. 나는 확실히 말할 수는 없지만 ecto2의 일반적인 오류는 소유권이 섞여 있다는 것입니다. ecto2를 사용하면 트랜잭션이 어떤 프로세스에 속하는지 추적하여 동시 상태 저장 테스트가 작동 할 수 있도록 프로세스 소유권 메커니즘이 구현됩니다.

그러나 에 해당 매핑을에게 전달해야합니다. on_exit은 호출자와 별도의 프로세스에서 실행되므로 ecto가 소유하고있는 트랜잭션을 알지 못하면 데이터베이스에 액세스하려고 시도하므로 오류가 발생합니다.

프로세스가 공유 트랜잭션에서 데이터베이스에 액세스 할 수 있도록 sandbox의 모드를 설정하도록 ecto (setup 블록)에 지시해야 할 수 있습니다. MySQL을 사용하고 있으므로 동시 데이터베이스 테스트를 실행하지 않으므로 수동으로 소유권을 관리 할 필요가 없으므로 모든 항목에 대해 공유 모드를 켜는 것이 가장 좋습니다.

이 함께 수행 할 수 있습니다 :

는 는 는

나는이 게시물에 문서의 관련 부분의 일부를 붙여 것입니다하지만 난 그것을 정의하지 것이다 체외의이 부분에 대한 설명서는 매우이다

setup do 
    Ecto.Adapters.SQL.Sandbox.mode(Perf.Repo, {:shared, self()}) 
end 
유용하고, 상세하며, 유용합니다. https://hexdocs.pm/ecto/Ecto.Adapters.SQL.Sandbox.html