[hunchentoot-devel] Unit testing Hunchentoot websites
Vamsee Kanakala
vamlists at gmail.com
Sun Apr 15 09:13:28 UTC 2007
Slava Akhmechet wrote:
> I'm building a web framework on top of Hunchentoot and I ran into
> problems while trying to unit test some of my code. Essentially I need
> to unit test behavior that happens accross requests. I want to do it
> without starting Hunchentoot by faking the necessary objects (request,
> session, etc.)
>
I had a similar problem, and I guess my not very elegant solution was to
create a dummy-request class, which basically has the same slots as that
of hunchentoot::request, and you can set parameters like so, and set the
dummy request instance to *request*:
(defclass dummy-request ()
((headers-in :initarg :headers-in :initform nil)
(method :initarg :method)
(uri :initarg :uri)
(server-protocol :initarg :server-protocol)
(content-stream :initarg :content-stream
:reader content-stream)
(cookies-in :initform nil)
(get-parameters :initform nil)
(post-parameters :initform nil)
(script-name :initform nil)
(query-string :initform nil)
(session :initform nil
:accessor hunchentoot::session)
(aux-data :initform nil
:accessor hunchentoot::aux-data)
(raw-post-data :initform nil)))
And then:
(let ((*request* (make-instance 'dummy-request)))
(setf (slot-value *request* 'method) :post)
(setf (slot-value *request* 'post-parameters)
'(("id" . "10") ("name" . "Chicago")))
And you can access this in the regular way:
(setf some-var (get-parameter "id"))
I found out that setting some vars like hunchentoot::*session-secret*
properly and doing a start-session lets you use session within a test
happily. For most tests that use session/request related code, I do
something like this and put it in a macro:
(let* ((hunchentoot::*remote-host* "localhost")
(hunchentoot::*session-secret* (hunchentoot::reset-session-secret))
(hunchentoot::*reply* (make-instance 'hunchentoot::reply))
(*request* (make-instance 'dummy-request))
(*session* (start-session)))
I'm not sure if this is the best way to do this, but this approach works
fine for me.
HTH,
Vamsee.
More information about the Tbnl-devel
mailing list