2016-10-01 2 views
1

Datomic 트랜잭션 데이터를 생성하는 Clojure에 몇 가지 코드를 작성했으며 데이터가 예상대로 생성되었는지 확인하기 위해 몇 가지 테스트를 작성하고 싶습니다.Datomic 트랜잭션 데이터를 생성하는 테스트 코드

[{:db/id (d/tempid :db.part/user) 
    :some-field "Bob"}] 

= 

[{:db/id (d/tempid :db.part/user) 
    :some-field "Bob"}] 

[{:db/id (d/tempid :db.part/user) 
    :ref-field (d/tempid :db.part/user -1)} 
{:db/id (d/tempid :db.part/user) 
    :ref-field (d/tempid :db.part/user -1)}] 

= 

[{:db/id (d/tempid :db.part/user) 
    :ref-field (d/tempid :db.part/user -2)} 
{:db/id (d/tempid :db.part/user) 
    :ref-field (d/tempid :db.part/user -2)}] 

하지만, 그러나

[{:db/id (d/tempid :db.part/user -1) 
    :some-field "Bob"}] 

!= 

[{:db/id (d/tempid :db.part/user -2) 
    :some-field "Bob"}] 

, 나는 단순히 비교할 수 없습니다

는 기본적으로, 나는 트랜잭션 데이터에 대한 것을 설명 할 수 있어야합니다 예상 된 값을 가진 결과물을 출력합니다. C가 생성 할 때까지 생성 된 정확한 DbID를 결코 알지 못할 것입니다. ode, 결과는 매번 다를 수 있습니다 (d/tempid ...)가 어쨌든 호출됩니다. 따라서 평등 검사는 false를 반환합니다.

누구나 일반적인 방법으로이를 수행하는 가장 좋은 방법은 없으므로 어떤 유형의 거래 데이터 (예 : 중첩 된 거래 데이터로 작동)와 관련하여도 실행할 수 있습니까?

오버라이드 된 equals 메소드를 사용하여 내 자신의 MockDbId 유형을 만든 다음이 모의 ID를 반환하는 테스트에서 (d/tempid ...)를 재정의했지만이를 달성하는 좋은 방법이라고 생각하지 않습니다. 원하는 행동.

모든 조언을 주시면 감사하겠습니다.

감사합니다.

매트.

답변

0

당신은 wild-match? 기능을 from the Tupelo library.

샘플을 사용하여이 문제를 해결할 수 있습니다 : 당신이 거래 결과의 깊은 검사를 수행하고자하는 경우 :db/id

:a 교체, 귀하의 경우에는

(wild-match? {:a :* :b 2} 
       {:a 1 :b 2})   ;=> true 

(wild-match? [1 :* 3] 
       [1 2 3] 
       [1 9 3]))   ;=> true 

(wild-match? {:a :*  :b 2} 
       {:a [1 2 3] :b 2}) ;=> true 

tx-datoms 기능을 사용할 수 있습니다. 여기에 그래서 당신이 :e 또는 :tx 값이 될 것입니다 무엇인지 미리 알 수없는 예를 들어 from the unit test:

; Create Honey Rider and add her to the :people partition 
    (let [tx-result @(td/transact *conn* 
         (td/new-entity :people ; <- partition is first arg (optional) to td/new-entity 
          { :person/name "Honey Rider" :location "Caribbean" :weapon/type #{:weapon/knife} })) 

     tx-datoms (td/tx-datoms (live-db) tx-result) 
    ] 
    ; tx-datoms looks like: 
    ; [ {:e 13194139534328, 
    ;  :a :db/txInstant, 
    ;  :v #inst "2016-10-02T21:45:44.689-00:00", 
    ;  :tx 13194139534328, 
    ;  :added true} 
    ;  {:e 299067162756089, 
    ;  :a :person/name, 
    ;  :v "Honey Rider", 
    ;  :tx 13194139534328, 
    ;  :added true} 
    ;  {:e 299067162756089, 
    ;  :a :location, 
    ;  :v "Caribbean", 
    ;  :tx 13194139534328, 
    ;  :added true} 
    ;  {:e 299067162756089, 
    ;  :a :weapon/type, 
    ;  :v 17592186045419, 
    ;  :tx 13194139534328, 
    ;  :added true} ] 
    (is (= "Honey Rider" (:v (only (keep-if #(= :person/name (:a %)) tx-datoms))))) 
    (is (= "Caribbean" (:v (only (keep-if #(= :location  (:a %)) tx-datoms))))) 
    (is (= 1    (count (keep-if #(= :weapon/type (:a %)) tx-datoms)))) 
    (is (= 1    (count (keep-if #(= :db/txInstant (:a %)) tx-datoms)))) 
    (is (apply = (map :tx tx-datoms))) ; All datoms have the same :tx value 
) 

,하지만 당신이 정말로 (마지막 테스트 참조)해야하는 경우는 어떤지를 확인할 수 있습니다.

+0

안녕하세요 Alan - 답장을 보내 주셔서 감사합니다. 귀하의 솔루션은 예제에서 첫 번째 코드 블록에 대해서는 문제가 없지만 다른 부분에는 필요한 기능을 제공하지 않습니다. 예를 들어 두 번째 블록에서 첫 번째 맵의 temp id가 두 번째 맵의 temp id와 동일한 지 확인해야하므로 값을 완전히 무시할 수는 없습니다. 와일드 카드로는이 작업을 수행 할 수 없습니다. – Sigmoidal

+0

유스 케이스가 무엇인지 확실하지 않지만 포스트 - 트랜잭션 값을 확인할 수있는 방법을 보여주는 답을 업데이트했습니다. –

관련 문제