-----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" <[email protected]> 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 [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en
