-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Stuart,

I just read through this thread again and noticed that I didn't notice
you mentioning that I can stub functions within tests. I had a look at
the clojure.test documentation, but I didn't find an example of that.

How would that apply to my case? Would I still have to pass a function
in? (One wouldn't be enough actually, I have several load functions by now.)

Whether I'll do TDD or not, I decided that I definitely need unit tests.

On 10/12/2010 06:59 PM, Stuart Sierra wrote:
> Datatypes that implement a single method can be more simply
> represented as ordinary functions, e.g.
> 
> (defn real-provider ...)
> (defn fake-provider ...)
> 
> (defn load-page [provider ...]
>   (let [foo (provider)]
>   ...))
> 
> That being said, you have other options: In clojure.test you can using
> `binding` to stub out functions within your tests. Lazytest <http://
> github.com/stuartsierra/lazytest> has explicit support for stubbing
> out functions during testing.
> 
> -S
> 
> 
> On Oct 11, 6:06 pm, "Felix H. Dahlke" <f...@ubercode.de> wrote:
>> Hi,
>>
>> I'm new to Clojure, using it for a reasonably sized project for the
>> first time, and I'm trying to do test-driven development.
>>
>> While it does work well technically  - clojure.test is very nice to use
>> and feels a lot like JUnit 4's assertThat() - I'm wondering if I'm
>> trying to program Java in Clojure.
>>
>> Here's an example:
>>
>> I'm writing a class (Um. I mean, a ... namespace? Well, a horde of
>> functions.) that accesses web pages from a backend, which can e.g. take
>> these from the filesystem or from a database. In Java or C++, I'd use an
>> interface for that and create one implementation for the filesystem and
>> one for the database:
>>
>> interface Provider {
>>     String loadPage(String name);
>>
>> }
>>
>> This is possible in Clojure:
>>
>> (defprotocol Provider
>>   (load-page [this name])
>>
>> It can be implemented using deftype:
>>
>> (deftype DatabaseProvider []
>>   Provider
>>   (load-page [this name]
>>     (have-fun-with-the-database)))
>>
>> And I can call it like this:
>>
>> (load-page (DatabaseProvider.) "foo")
>>
>> Feels a little weird (especially since all examples of defprotocol and
>> deftype use camel case for type names), but works.
>>
>> Back to my question: Am I trying to do Java in Clojure? Is there a more
>> Lisp-y way to do this?
>>
>> As you may have suspected, this design wasn't my initial intention, it
>> was driven by TDD: This allows me to create a mock implementation
>> against which I can write my test cases without having having to depend
>> on external resources. Typical TDD design. In fact, there will only be
>> one backend for now.
>>
>> This made me wonder if test-driven development was desirable in Clojure
>> at all, or even in functional programming in general.
>>
>> There's a few articles on the issue. Many seem to be from Clojure
>> newcomers, asking questions themselves, and none handles design issues
>> like mock objects [1].
>>
>> One guy basically said that he stopped doing TDD because the REPL makes
>> it possible to test specific functions directly [2]. I can see how he
>> says that the *driven* aspect of TDD can be performed by the REPL, but I
>> find it too inconvenient for extensive use.
>>
>> Bob Martin says that, because functional programming differs from
>> object-oriented programming (In my opinion, these paradigms are
>> compatible - did he mean imperative programming?), test-driven
>> development has to start by testing the details, and work up to testing
>> the big picture. TDD in e.g. Java starts with the big picture and moves
>> down. I don't understand his points completely, but if he's right, this
>> might be a fundamental problem for TDD in functional languages.
>>
>> One guy partly disagrees with him on some matters, but doesn't really
>> mention the bottom-up thing [4].
>>
>> What are your thoughts on these issues? Is anybody here doing TDD in
>> Clojure? Is anybody against it?
>>
>> [1]:http://www.magpiebrain.com/2010/02/16/struggling-with-test-driven-clo...
>> [2]:http://s-expressions.com/2009/07/28/clojure-the-repl-and-test-driven-...
>> [3]:http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure
>> [4]:http://ericlefevre.net/wordpress/2010/06/04/bob-martin-on-tdd-in-cloj...
>>
>>  signature.asc
>> < 1KViewDownload
> 

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkzEgvgACgkQJc3crOgfbuZlJQCfY5EBm1inU6cqr3be2Mn6QwZ0
qN4AoLlvV7dITlbPNDvr+Uy8xEBB1e0u
=cuPJ
-----END PGP SIGNATURE-----

-- 
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

Reply via email to