Book Image

Visualforce Development Cookbook - Second Edition

By : Keir Bowden
Book Image

Visualforce Development Cookbook - Second Edition

By: Keir Bowden

Overview of this book

Visualforce is a framework that allows developers to build sophisticated, custom user interfaces that can be hosted natively on the Force.com platform. The Visualforce framework includes a tag-based markup language, similar to HTML that is used to write the Visualforce pages and a set of controllers that are used to write business logic to the Visualforce pages. Visualforce Development Cookbook provides solutions to a variety of challenges faced by Salesforce developers and demonstrates how easy it is to build rich, interactive pages using Visualforce. Whether you are looking to make a minor addition to the standard page functionality or override it completely, this book will provide you with the help you require throughout. You will start by learning about the simple utilities and will build up to more advanced techniques for data visualization and to reuse functionality. You will learn how to perform various tasks such as creating multiple records from a single page, visualizing data as charts, using JavaScript to enhance client-side functionality, building a public website, and making data available to a mobile device. With an interesting chapter on tackling common issues faced while developing Visualforce pages, the book provides lots of practical examples to enhance and extend your Salesforce user interface.
Table of Contents (16 chapters)
Visualforce Development Cookbook - Second Edition
Credits
About the Author
About the Reviewer
www.PacktPub.com
Preface

Testing a custom controller


Writing unit tests for Visualforce page controllers is often a source of confusion for developers new to the technology. A common mistake is to assume that the page must somehow be rendered and interacted with in the test context, whereas in reality, the page is very much a side issue. Instead, tests must instantiate the controller and set its internal state as though the user interaction has already taken place, and then execute one or more controller methods and confirm that the state has changed as expected.

In this recipe, we will unit test SearchFromURLController from the Reacting to URL parameters recipe.

Getting ready

This recipe requires that you have already completed the Reacting to URL parameters recipe, as it relies on SearchFromURLController being present in your Salesforce instance.

How to do it...

  1. Create the unit test class by navigating to the Apex Classes setup page and by clicking on Your Name | Setup | Develop | Apex Classes.

  2. Click on the New button.

  3. Paste the contents of the SearchFromURLControllerTest.cls Apex class from the code download into the Apex Class area.

  4. Click on the Save button.

  5. On the resulting page, click on the Run Tests button.

How it works...

The tests successfully execute, as shown in the following screenshot:

Open the Developer Console by clicking on your name at the top right of the screen and selecting Developer Console from the resulting drop-down menu:

Select the Tests tab and you will see the test coverage information on the right-hand side, showing 100% code coverage for the SearchFromURLController class:

Note

Percentage coverage is important as at least 75 % coverage across all code must be achieved before classes may be deployed to a production organization.

The test class contains two unit test methods. The first method tests that the search is correctly executed when the search term is passed on the page URL. As unit tests do not have access to organization data, the first task for the test is to set up three test accounts:

List<Account> accs=new List<Account>(); 
accs.add(new Account(Name='Unit Test')); 
accs.add(new Account(Name='Unit Test 2')); 
accs.add(new Account(Name='The Test Account')); 
insert accs; 

As the controller is reacting to parameters on the URL, the page reference must be set up and populated with the name parameter:

PageReference pr=Page.SearchFromURL; 
pr.getParameters().put('name', 'Unit'); 
Test.setCurrentPage(pr); 

Finally, the controller is instantiated, which causes the action method that executes the search to be invoked from the constructor. The test method then confirms that the search was executed and the actual number of matches equals the expected number:

SearchFromURLController controller=new  
         SearchFromURLController(); 
System.assertEquals(true, controller.searched); 
System.assertEquals(2, controller.accounts.size()); 

The second unit test method tests that the search is correctly executed when the user enters a search term. In this case, there is no interaction with the information on the page URL, so the test simply instantiates the controller and confirms that no search has been executed by the constructor:

SearchFromURLController controller=new SearchFromURLController(); 
System.assertEquals(false, controller.searched); 

The test then sets the search term, executes the search method, and confirms the results:

controller.name='Unit'; 
System.assertEquals(null, controller.executeSearch()); 
System.assertEquals(2, controller.accounts.size()); 

See also

  • The Testing a controller extension recipe in this chapter shows how to write unit tests for a controller that extends a standard or custom controller.