2016-10-01 8 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はわかりません(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

こんにちはアラン - 返信いただきありがとうございます。私の例では、あなたのソリューションは最初のコードブロックでうまく動作しますが、他の部分に必要な機能は私には与えられません。たとえば、2番目のブロックでは、最初のマップのtemp idが2番目のマップのtemp idと同じであることを確認する必要があるため、値を完全に無視することはできません。ワイルドカードでこれを行うことはできません。 – Sigmoidal

+0

私は、トランザクション後の値をチェックする方法を示すために答えを更新しましたが、私はこれのためのユースケースが何か分かりません。 –

関連する問題