Re: Mocking multimethods

2010-12-22 Thread Brian Marick
> What are the cons of using midje? Any reason I shouldn't migrate all > my unit testing to it? I'm biased, but I think Midje is ready for production use. There's a smooth migration path because Midje uses the same reporting as clojure.test, so you can mix styles in the same file and still use

Re: Mocking multimethods

2010-12-22 Thread Alex Baranosky
I love Midje and think migrating all the tests to it is a great idea. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with

Re: Mocking multimethods

2010-12-22 Thread Alyssa Kwan
Thanks, Brian! I obviously didn't understand the nature of the provided form. That's really cool notation! This is exactly what I want. What are the cons of using midje? Any reason I shouldn't migrate all my unit testing to it? Thanks! Alyssa On Dec 22, 9:46 am, Brian Marick wrote: > On Dec

Re: Mocking multimethods

2010-12-22 Thread Brian Marick
On Dec 22, 2010, at 6:52 AM, Alyssa Kwan wrote: > The issue is where do I specify that: > (undo-fn ...patch...) => (fn [] (reset! visible-evidence-of-a-side- > effect :happened!)) The code you quoted is that specification. It doesn't matter that undo-fn is a multimethod. Here's what the notat

Re: Mocking multimethods

2010-12-22 Thread Alyssa Kwan
The issue is where do I specify that: (undo-fn ...patch...) => (fn [] (reset! visible-evidence-of-a-side- effect :happened!)) undo-fn is a multimethod in my design, which requires a corresponding defmethod for each patch type. I need to create one for the scope of the test, but defmethod by defin

Re: Mocking multimethods

2010-12-22 Thread Alyssa Kwan
I'd like to discuss this design approach. (It's unrelated to the testing issue.) I avoided this design because the undo-fn is determined at do-patch! time. The use case is for a persistent system like Git where patches may be undone long after being done - e.g. long after the patch is written to

Re: Mocking multimethods

2010-12-22 Thread Brian Marick
I think I misunderstand the issue, because this works for me: (ns midje.util.git (:use [midje.sweet])) ;; Code except for undo-patch is the same as before. ;; ... ;; I pulled remove-patch out of undo-patch because I was ;; getting a screwy read error I didn't want to figure out ;; at 5 in the

Re: Mocking multimethods

2010-12-22 Thread Meikel Brandmeyer
Hi, maybe a different approach could be to use a richer datatype than a function, which carries both: the command and the undo command. (deftype Command [action undo]) Then you could do something like: (defn do-patch! [command args] (dosync (let [patch {:command command :args (vec args

Re: Mocking multimethods

2010-12-21 Thread Alyssa Kwan
Hi Alex, Unfortunately the some-fn has to be created at the top level; it has to be a var to be dynamically bindable, and Midje (and AFAIK, all other mocking frameworks) use dynamic binding. Here's what I came up with, using clojure.contrib.mock.test-adapter: (deftest test-undo-patch!-calls-undo

Re: Mocking multimethods

2010-12-21 Thread Alex Baranosky
So I lied, I couldn't resist doing just one more: (defn some-fn [] nil) (fact "calls the anonymous function that undo-fn returns" (undo-patch ...patch...) => @patches- (provided (undo-fn ...patch...) => some-fn (some-fn) => nil)) The two provided statements are mboth mocking and stub

Re: Mocking multimethods

2010-12-21 Thread Alex Baranosky
Hi Alyssa, Using the midje library I was able to do your first test. I'm pretty tired so I this might be it for the night. (fact "throws an error if can't resolve undo function" (undo-patch [2]) => (throws IllegalArgumentException "No method in multimethod 'undo-fn' for dispatch value: null"))

Mocking multimethods

2010-12-21 Thread Alyssa Kwan
Hi everyone, Does anyone have any experience in mocking multimethods? I'm working on a version control framework modeled after Git: (def ^{:private true} patches- (ref []) (defn patches [] (seq @patches-)) (defn do-patch! [fn & args] (dosync (apply fn args) (let [patc