# How to implement testing?

**URL:** <https://www.ruby-forum.com/t/how-to-implement-testing/83127>\
**Category:** Rails\
**Created:** [January 23, 2007, 8:38pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127 "2007-01-23T20:38:57Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 23, 2007, 8:38pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/1 "2007-01-23T20:38:57Z")

</div>

Hi people,

i’m wondering what’s the best way to test your rails application.  
Should you constantly write tests while your writing your application  
code? (method -\> test method -\> method -\> etc.) Or should you focus on  
building your application and than building the tests?

Thanks for your advice.

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 24, 2007, 11:14pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/2 "2007-01-24T23:14:54Z")

</div>

Hi Petar,

A good advise is to use small steps. Create a test, then write (as a  
rule of thumb) max. 10 lines of code, or a small function. Repeat until  
you are done 😉

IsBOF

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 26, 2007, 5:44am UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/3 "2007-01-26T05:44:02Z")

</div>

Hi Petar,

If you can start mastering the concepts of Test Driven Development, you  
would be doing yourself a huge favor. This is what I do:

1. Create a scaffold\_resource for the functionality and model I want to  
build (I am really into RESTful development these days)
2. Write an integration test that contains its own Domain Specific  
Language (or DSL) so I can write my test cases in english. I basically  
write out a user story of what I want this part of the app to do. I’ll  
put an example after this list.
3. Run my integration test and watch it fail in a blaze of glory.
4. Write the code for my migration and model to provide the model-based  
functionality needed for the integration test.
5. Run the unit tests built by the scaffold, then work the code in the  
model until the unit tests pass.
6. Write the controller code required to make my integration tests  
pass. I usually do these one at a time (my integration tests have a  
number of small scenarios to test in them). Some of the tests will  
usually pass with the stuff the scaffold generates. That is considered  
a bonus! I work the rest one at a time, running the test in between  
each iteration, until everything works.

Now if your integration test is a good representation of the user story  
for that functionality, when you get to this point, your code should be  
fairly complete. All you should have to do is get your views in order  
and you’re golden.

Here is an example integration test that I have used:

class ForumTest \< ActionController::IntegrationTest  
fixtures :forums, :forum\_posts, :users

def test\_forum  
quentin = enter\_site(:quentin)  
quentin.views\_forum\_page  
forum = quentin.selects\_forum  
quentin.views\_posts forum  
quentin.tries\_to\_post forum  
quentin.logs\_in(“quentin”, “test”, forum)  
q\_post = quentin.posts\_to\_forum forum

```
aaron = enter_site(:aaron)
aaron.logs_in("aaron", "test")
posts = aaron.searches_forums
a_post = aaron.selects_post_from_results q_post
a_reply = aaron.replies_to_post(forum, a_post)

quentin.views_posts forum
reply = quentin.notes_new_reply q_post

quentin.is_reply_aarons_post?(reply, a_reply)

```

end

private

module ForumTestDSL  
include ERB::Util

```
attr_writer :name

def views_forum_page
  ...
end

def selects_forum
  ...
end

def views_posts(forum)
 ...
end

def tries_to_post(forum)
 ...
end

def logs_in(user_name, password, forum=nil)
  ...
end

def posts_to_forum(forum)
  ...
end

# you get the picture
...

def is_reply_aarons_post?(reply, d_post)
  ...
end

```

end

def enter\_site(name)  
open\_session do |session|  
session.extend(ForumTestDSL)  
session.name = name  
yield session if block\_given?  
end  
end  
end

There is a ton of info on TDD out there, so you should have no trouble  
getting really good advice on the subject.

Hope this helps!

C

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 26, 2007, 3:42pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/4 "2007-01-26T15:42:39Z")

</div>

Hi Nick,

I started using scaffold\_resource (as opposed to scaffold) when I  
started getting into REST. The scaffold\_resource generator really does  
a nice job of creating actions and tests for a RESTful implementation.  
It also now adds the route to the routes.rb file, which it used to not  
do. It is very convenient if you want to develop a RESTful  
application. If you are not into REST, that’s cool. It just so  
happens that REST was the new direction of Rails when I started  
developing my new app, so I decided to give it a shot. I like it alot.  
Unfortunately, the results of that generator are not documented in the  
latest Agile book, so you kind of have to play around with it (make  
sure you are running Edge or Rails 1.2 to see it in all its glory).

As far as what you are doing, you are basically doing the same thing as  
you said, but you appear to be leaving out the Integration Test. No  
problem there, of course, but I have found that writing an Intergration  
Test first, in the manner in which I do above (with a DSL), helps me to  
think about what my application needs to do from a user perspective.  
That’s fantastic if you can keep all of that in your head, but I have  
found it a lot easier on my short-term memory if I write this out first  
so that I have a target in mind before I really begin coding. Not that  
my way is any more right than anyone else’s, it just works for me.

C

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 26, 2007, 2:17pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/5 "2007-01-26T14:17:48Z")

</div>

i do something like redmotive, but i don’t use scaffold (don’t ask me  
why, i don’t know 🙂 ), i create all by my own, and another difference  
is that i create first the model and then tests and code, ok, it’s not  
real TDD with develop first the model, but i think that it’s quite safe,  
obviously i put in the model only what i need not, not things that MAYBE  
i’ll need in the future (YAGNI)

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 26, 2007, 3:59pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/6 "2007-01-26T15:59:03Z")

</div>

redmotive wrote:

> As far as what you are doing, you are basically doing the same thing as  
> you said, but you appear to be leaving out the Integration Test. No  
> problem there, of course, but I have found that writing an Intergration  
> Test first, in the manner in which I do above (with a DSL), helps me to  
> think about what my application needs to do from a user perspective.  
> That’s fantastic if you can keep all of that in your head, but I have  
> found it a lot easier on my short-term memory if I write this out first  
> so that I have a target in mind before I really begin coding. Not that  
> my way is any more right than anyone else’s, it just works for me.

i’m using integration tests and DSL too 🙂 and the possibility to create  
more than one single session is great…I’m using also some functional  
tests for controllers which do just things separately from other  
controllers

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 26, 2007, 4:11pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/7 "2007-01-26T16:11:43Z")

</div>

I hear ya nick. Didn’t mean to impune the integrity of your testing,  
you just didn’t mention it 😉 No offense intended. I have found that  
writing my integration tests first has helped me keep my head wrapped  
around the project, but that’s just because I need the extra focus.  
You may be doing the same thing, I was just commenting on what you  
wrote. Hope I didn’t offend you!

C

---

<div class="post-metadata">

**Author:** ![petar](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/dfb087/32.png) [@petar](https://www.ruby-forum.com/u/petar)\
**Post date:** [January 26, 2007, 4:14pm UTC](https://www.ruby-forum.com/t/how-to-implement-testing/83127/8 "2007-01-26T16:14:33Z")

</div>

redmotive wrote:

> I hear ya nick. Didn’t mean to impune the integrity of your testing,  
> you just didn’t mention it 😉 No offense intended. I have found that  
> writing my integration tests first has helped me keep my head wrapped  
> around the project, but that’s just because I need the extra focus.

yes 🙂

> Hope I didn’t offend you!

no 🙂
