On Sat, Jan 3, 2015, at 02:46 AM, Brian Marick wrote:
> 
> > I use TDD and mocking/stubbing (conjure) to test each layer of my code.
> > The problem is when I change the function signature and the tests do not
> > break, because the mocks/stubs do not know when their argument lists no
> > longer agree with the underlying function they are mocking.  Is there a
> > way to catch this?  Short of a test suite that eschews stubbing in favor
> > of full setup/teardown of DB data for each test?
> 
> Could you give an example? I use mocks fairly heavily, and I don't seem 
> to have this problem. Perhaps it's because I change the tests before the 
> code?

Although the subject changed a little bit, I would be still interested
in your approach to refactoring if there is heavy use of mocking. Let me
give you an example:

Let's say I am writing a login form, trying to use the top-down approach
you described. My approach could be the following:

(unfinished check-pw)

(fact "login-form succeeds if user enters the correct password"
  (login-form-success? {:username "admin" :password "secret"}) => true
  (provided
    (db/get-user "admin") => (contains (:password "my-secret-hash"))
    (check-pw "my-secret-hash" "secret") => true))

(defn login-form-success? [user-input]
  (let [user (db/get-user (:username user-input))]
    (check-pw (:password user) (:password user-input))))

Then I finish the check-pw function and everything works.

Now, later that day I decide that I pass the whole user object to the
check-pw function. Maybe I want to use the user ID as a salt, or maybe I
just want to leave the possibility for checking password expiration,
etc. So I modify the test and the implementation of check-pw so that the
first parameter is the user object, not the password hash.

Suddenly my co-worker comes to me saying "hey, I need you on a meeting
right now!" I close my laptop, and an hour later I think "where were
we?..." I run all the tests, and they all pass, so I commit.

Except... I forgot to modify all the invocations of check-pw in both the
test and the implementation. Every test pass, so I have no way of
finding out the problem without careful code review or by examining the
stack traces from the live code.

While this bug is easy to catch, what if my function is mocked in
several places, and I fail to rewrite all of them properly?

Do you have any advice on what you would have done differently here to
avoid this bug?

Regards,
Akos

-- 
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 your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to