Unit testing & Functional testing. Noob questions

Hola!

I’m new to Rails (it’s my 2nd day reading the Agile development with Rails book) and I’m kinda confused with the tests.

So let me get this straight: Withunit testing, we see if our model is working as it should (as our app’s specifications demands) and Rails provides us with all the unit testing features just to make our lifes easier, so we don’t have to manually enter values to see if they’re accepted or not. Is that right? And we’re doing these tests to save ourself from future work for fixing bugs in our code etc. With unit testing we can pre-emptively fix our code’s possible bugs, right from the beggining.

Unit testing seems clear, but Functional testing is a little confusing to me: Why are we doing this? Where does it helps us? I know that we’re testing for example if there are certain elements in our rendered views, for example: assert_select ‘#columns #side a’, minimum: 4 but how could we not have these elements in our views? Why are these kinds of test useful and not just extra-code to write? To me it seems more like a security-measure (checking if certain links appear on a page) more than a test to see if something is wrong. However, judging from the file names, functional testing is about the controller, right?

Thanks in advance :slight_smile:

Hola!

I'm new to Rails (it's my 2nd day reading the Agile development with Rails
book) and I'm kinda confused with the tests.

So let me get this straight: With unit testing, we see if our model is
working as it should (as our app's specifications demands) and Rails
provides us with all the unit testing features just to make our lifes
easier, so we don't have to manually enter values to see if they're accepted
or not. Is that right? And we're doing these tests to save ourself from
future work for fixing bugs in our code etc. With unit testing we can
pre-emptively fix our code's possible bugs, right from the beggining.

Unit testing seems clear, but Functional testing is a little confusing to
me: Why are we doing this? Where does it helps us? I know that we're testing
for example if there are certain elements in our rendered views, for
example: assert_select '#columns #side a', minimum: 4 but how could we
*not* have these elements in our views?

It may seem obvious to you that the views are basically all right
because you can see that they are when you run the s/w. However,
perhaps there are a few conditions that change the details of what
appears on the page, maybe you view the page as a normal user and as
an admin, or perhaps with a different value of some field in the
database the view changes some detail. No problem, just try each of
these conditions and check it is ok. You can easily do this each time
you update the website.

Now add another 50 different pages ( a number of different controllers
and the different views for that controller). Each of those will have
a number of things you need to check you have not accidentally messed
up when you release a new version of the site. To manually check that
all the views still operate correctly becomes virtually impossible.

With automated testing you can be reasonably sure that you have not
accidentally messed something up and will allow you to sleep soundly
in your bed at night.

Colin

I think I get it now: We 're just making sure that our views has everything it should in it’s place (links, html elements etc) even after some new features we may add to our site (permission levels, authentication etc)?

However I think that in the book it isn’t explained in a clear way:

The unit testing of models that we did previously seemed straightforward
enough. We called a method and compared what it returned against what
we expected it to return. But now we are dealing with a server that processes
requests and a user viewing responses in a browser. What we will need is
functional tests that verify that the model, view, and controller work well
together. Never fear, Rails makes this easy too.

It just states that we’ll verify that the model, view and controller work well together. But as I see it, functional test is all about the controller and the view since it checks for elements that appear on the view to see if the controller is functioning properly, isn’t that right?

It is also checking that the controller is calling appropriate model
methods. That may be what it means. But mostly it is about controller
and views, yes. It is not only checking that the correct data appears
on the view, but also checking that the correct view is shown in the
first place.

Colin

Thanks a bunch Colin!

While unit testing tests each element separately, functional tests are
aiming
at testing system as a whole. I.e. unit testing do not check how
elements work
together.

Moreover, over the course of project code changes. So, new bugs are
introduced, too.
Things which seem impossible at the moment ('we always have these
elements in our views')
after code changes are not so impossible anymore :wink: This is especially
true when new
coder joins the team and do not know previous assumptions.