Many developers recently discovered that the Test Driven Development (TDD) process improves the development process significantly. While testability is relatively easy in the desktop world, Web applications are not so easily tested. One of the problems is that a Web application runs in a different process, making it impossible to communicate with the test code. As a result, what we are testing is a raw Html output, rather than the application's internals. Another problem is that it is very difficult to put a Web application into a special environment that is more suitable for testing. For example, we cannot check the behaviour of the system when a database is unavailable, unless we manually stop the server.
Several Asp.Net frameworks exist, but they are either parsing the Html output and recreating the structure of the page (NUnitAsp), or test the client-side functionality (Selenium and WatiN). Another framework, Plazma, hosts the Asp.Net engine so that it is executed in the test runner process; however, due to the engine's inherent untestability we are still unable to test, let alone mock, the page's intrinsics. As a result, we can write integration, but not unit, tests. For example, to verify that a certain label displays the user's name, we have to add a user to our database, navigate to the login page, enter the user's credentials, navigate to the page being tested, parse the output in order to find a span with a certain ID, and check the span's inner text. Oh, and not forget to delete the user at the end of the test.
With Ivonna, it is different. You are programming in a way similar to desktop testing. You setup your mocks, in this case, mock the Membership service, then you request a page (you have a "real" instance of the Page class, not the raw Html), find the label you need and check its Text property. But there's more: you can run asserts not only against the response, but also during the page's lifecycle. For example, you can add a Page_Init handler and verify the label's initial value or visibility. You can also run tests against concrete page classes (for example, if you want to test a page-specific method) or App_Code classes. Just step into the request like described above, and run your test.