Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TDD: Test MVC application

I've started from scratch a new application using TDD and PHPUnit. It is going to be a MVC application. I've started my tests from the Model. That was fun and i didn't have too much problems.

Now I want to create my views/models. But the question is: How do I test my controllers? What about views? My controller will use my tested models and my future views.

Thanks.

like image 230
thom Avatar asked Feb 22 '23 23:02

thom


2 Answers

There are three broad categories of testing for each of the layer in the MVC. The unit tests for models, functional tests for the controllers and the UI testing for the views.

Unit tests are the easiest to write. They are cheap in terms of time and do not require too many dependencies to be stubbed/mocked.

Functional tests on the other hand are a bit expensive compared to an unit test. In a given scenario, if you had covered enough in your application for the models using unit test, you can relax a bit in the functional testing part. However, you should still be having a good code coverage - 100% to be ideal for your controller methods as well.

The last is the UI testing which is the costliest of all tests. You can probably use Selenium for browser based testing and try to automate it with your language. You may have to have a RC sever running in the background to achieve this. But trust me, if you cover the first two parts - unit and functional, this can be made optional if not no.

And it is advised to have a CI - Continious Integration setup with a code coverage utility that gives a trending on the % of code covered through tests.

like image 72
bragboy Avatar answered Feb 25 '23 12:02

bragboy


When you are running the tests , you should be using only the class under test. Other objects should be replaced with mocks or other fake structures.

You do this, because ( for example ) when you write a test for controllers action , you will have provide some values for said action, and then check if the correct data is passed to the view and models.

This is one of the reasons why you should avoid use of global state ( in form of static calls or global variables ) in your code.

Some links you might find useful

  • The Clean Code Talks - Unit Testing
  • The Clean Code Talks - Global State and Singletons
  • The Clean Code Talks - Don't Look For Things!
like image 41
tereško Avatar answered Feb 25 '23 13:02

tereško