Testing legacy code is not easy, but it's possible. In this chapter, we saw several different approaches, from the lightweight use of reflection and changing methods' visibility, to redefining functions with a third-party library, mocking the filestream, and then using runkit and changing anything that we wanted and needed to change.
It's up to you to decide when these methods are appropriate and when they are not. However, working with dirty code requires dirty methods. There are other libraries and extensions that do more or less the same things (for example, TestIt and ext/test_helpers).
This chapter explained to you the possibilities of what you can do when you want to write unit/integration tests for legacy code.
In the next chapter, we will see functional tests that were mentioned as another way to test legacy code—Selenium. It's something different and definitely something that you should know—you are running tests in the web browser, mimicking user behavior but still working...