Fork me on GitHub

Hi folks. Is anyone rebinding #'clojure.test/*test-out* for getting test output in the repl buffer? I replicated the nrepl workaround: with this:

(inf-clojure-eval-string "(do (require '[clojure.main :as m])
                                                :init #(do
                                                           ;; The :init hook replicates what clojure.main uses as an initial binding set, so it's good to repeat that.
                                                           ;; From 
                                                           (apply require m/repl-requires)
                                                           ;; Workaround for rebinding clojure.test/*test-out*.
                                                           ;; For details, see \"
                                                           (require 'clojure.test)
                                                           (let [bindings (into (get-thread-bindings)
                                                                                {#'clojure.test/*test-out* *out*})]
                                                             (push-thread-bindings bindings)))))")
however, I”m getting a stack overflow error when running a state-flow test [1] Unfortunately the code is private and I don’t have a minimum reproducible example, but I’d like to know if something seems wrong with my attempt to do the same (the code is similar to nrepls, but it’s not equal). [1]:


i always run the test as (binding [*test-out* *out*] (run-tests)) or an individual test


this seem safer. let me try.


i use registers and have a send register to repl function. I’m not sure if that’s made it into inf or i just keep that as separate


but i always have that run-tests form in register t and then have individual tests in register i


interesting. I still get the stack overflow error. This only happens when I bind clojure.test/*test-out*. I suppose this is a bug in state-flow. I’ll try to investigate it. error: I was still using the nrepl approach in this gist but the error I got now is the same, anyway It gets stuck in this:

clojure.core/fn (core_print.clj:317)
    clojure.lang.MultiFn.invoke (
    clojure.core$pr_on.invokeStatic (core.clj:3675)
    clojure.core$pr_on.invoke (core.clj:3669)
    clojure.core$print_sequential.invokeStatic (core_print.clj:66)
    clojure.core$fn__7411.invokeStatic (core_print.clj:225)
    clojure.core/fn (core_print.clj:225)
    clojure.lang.MultiFn.invoke (
    clojure.core$pr_on.invokeStatic (core.clj:3675)
    clojure.core$pr_on.invoke (core.clj:3669)
    clojure.core$print_prefix_map$fn__7414.invoke (core_print.clj:233)
    clojure.core$print_sequential.invokeStatic (core_print.clj:66)
    clojure.core$print_prefix_map.invokeStatic (core_print.clj:229)
    clojure.core$print_map.invokeStatic (core_print.clj:238)
    clojure.core$fn__7443.invokeStatic (core_print.clj:266)
    clojure.core/fn (core_print.clj:263)


ah, and actually, binding the var as you did still redirected the output to the original repl, not inf-clojure’s


if you remove all tooling and just use a socket repl you can have the best way to come up with a minimal example


nc localhost port and go from there fore the bug report


but at this point it’s not inf-clojure’s fault it seems. You could ask in #clojure for more eyes


yeap, agreed. I guess it’s not related to inf-clojure either in any case, thanks!


for sure. interested in how it works out


might have to add that binding to my clojure.main/repl invocation


yeap, it’s useful I also set pprint as the default printer


yeah i use this:

 :prompt (fn [] (printf "%s=> " (peek (str/split (str *ns*) #"\."))))
 :read server/repl-read
 :print fipp/pprint)


annoyingly, with this form

 :init   (fn [] {#'clojure.test/*test-out* *out*})
 :prompt (fn [] (printf "%s=> " (peek (str/split (str *ns*) #"\."))))
 :read server/repl-read
 :print fipp/pprint)
the behavior is not what i want
bookmark-test=> (with-bindings {#'*test-out* *out*} (run-tests)) ;; using manual bindings

Testing metabase.api.bookmark-test

FAIL in (foo) (NO_SOURCE_FILE:36)
expected: 1
  actual: 2
    diff: - 1
          + 2

Ran 3 tests containing 21 assertions.
1 failures, 0 errors.
{:test 3, :pass 20, :fail 1, :error 0, :type :summary}
bookmark-test=> (run-tests) ;; relying on bindings in #init
{:test 3, :pass 20, :fail 1, :error 0, :type :summary}


yeah. for some reason, the (get-thread-bindings) stuff seems necessary. but I never took the time to learn why, just blindly copied this snippet of code from nrepl 🤷