Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 测试生成Datomic事务数据的代码_Testing_Clojure_Transactions_Datomic - Fatal编程技术网

Testing 测试生成Datomic事务数据的代码

Testing 测试生成Datomic事务数据的代码,testing,clojure,transactions,datomic,Testing,Clojure,Transactions,Datomic,我已经在Clojure中编写了一些生成Datomic事务数据的代码,我想编写一些测试来检查数据是否按预期创建 基本上,我需要能够证明关于交易数据: [{:db/id (d/tempid :db.part/user) :some-field "Bob"}] = [{:db/id (d/tempid :db.part/user) :some-field "Bob"}] 及 但是 但是,我不能简单地将输出与预期值进行比较,因为在代码生成之前,我永远不会知道创建的确切DbId,而且每次调用

我已经在Clojure中编写了一些生成Datomic事务数据的代码,我想编写一些测试来检查数据是否按预期创建

基本上,我需要能够证明关于交易数据:

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

=

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

但是

但是,我不能简单地将输出与预期值进行比较,因为在代码生成之前,我永远不会知道创建的确切DbId,而且每次调用(d/tempid…)的结果都是不同的。因此,相等性检查将返回false

有没有人想过以一般方式执行此操作的最佳方法,以便它可以针对任何类型的事务数据运行(例如,使用嵌套事务数据)

我曾考虑过使用重写的equals方法创建自己的MockDbId类型,然后在测试中重新定义(d/tempid…)以返回此mockid,但这并不是实现所需行为的好方法

如有任何建议,将不胜感激

谢谢


Matt。

您可以使用
野生匹配?
功能解决此问题

样本:

(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
在您的情况下,将
:a
替换为
:db/id

如果您希望对交易结果进行更深入的检查,可以使用
tx datoms
功能。这里有一个例子

;创建Honey Rider并将其添加到:people分区
(让[tx结果@(td/transact*conn*

(td/new entity:people;您可以使用
wild match?
功能解决此问题

样本:

(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
在您的情况下,将
:a
替换为
:db/id

如果您希望对交易结果进行更深入的检查,可以使用
tx datoms
功能

;创建Honey Rider并将其添加到:people分区
(让[tx结果@(td/transact*conn*

(td/new entity:people;Hi Alan-感谢您的回复。在我的示例中,您的解决方案在第一个代码块中运行良好,但没有为我提供其他部分所需的功能。例如,在第二个代码块中,我不能完全忽略这些值,因为我需要验证第一个映射中的临时id是否与第二个映射中的相同。它是使用通配符不可能做到这一点。我更新了答案,以显示如何检查事务后值,尽管我不确定这是什么用例。嗨,Alan-感谢您的回复。您的解决方案在我的示例中的第一个代码块中运行良好,但没有为我提供其他部分所需的功能。在第二个示例中例如,我不能完全忽略这些值,因为我需要验证第一个映射中的临时id是否与第二个映射中的相同。使用通配符无法做到这一点。我更新了答案,以显示如何检查事务后值,尽管我不确定这方面的用例是什么。
(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
  ; 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
 )