Salesforce中为服务器分页Pagination编写测试类-Test Class For ApexPages.StandardSetController, hasNext, next etc.

场景描述:在为标准分页写测试Code的时候,不知道如何去覆盖如下的代码:

// 返回页面是否有下一页布尔值
    public Boolean hasNext {
        get {
            return setCon.getHasNext();
        }
        set;
    }
    
    // 返回页面是否有上一页布尔值
    public Boolean hasPrevious {
        get {
            return setCon.getHasPrevious();
        }
        set;
    }
    
    // 返回当前记录的页面数
    public Integer pageNumber {
        get {
            return setCon.getPageNumber();
        }
        set;
    }

    // 返回记录的总条数
    public Integer resultSize {
        get {
            return setCon.getResultSize();
        }
        set;
    }
    
    // 返回上一页记录
    public void previous() {
        setCon.previous();
    }
    
    // 返回下一页记录
    public void next() {
        setCon.next();
    }
经过反复试错,找到了解决方案,如下是完整代码片段:

1. VF Code:

<apex:page controller="TenderInformationPublicityController" showHeader="false" sidebar="false" cache="true" expires="900" title="比选信息公示" id="thePage"> 
<apex:includeScript value="{!$Resource.jQuery}"/> 
    <style>
        .form{margin: 12px 15px;}
        .dataList{margin: 7px 0 10px;}
        .noData{height: 70px;line-height: 70px;text-align: center;color: #a1a1a1;}
        .selectList{font-size: 75%;height: 20px;}
        .width_20{width: 20%;}
    </style>
    <apex:insert name="header">
        <c:SiteHeader />
    </apex:insert>

    <!--loading组件-->
    <c:StatusSpinner />    
    <apex:form styleClass="form" id="theForm">  
        <!-- <apex:pageMessages /> -->
        <apex:pageBlock title="比选信息公示" id="TenderProject">  
            选择比选项目记录类型:  
            <apex:selectList value="{! filterId}" size="1">  
                <apex:selectOptions value="{! listViewOptions}" />  
                <apex:actionSupport event="onchange" action="{!refreshPage}"  reRender="TenderProject" status="LoadingStatusSpinner" />
            </apex:selectList> 
            <apex:pageBlockTable id="thePageBlockTable" styleClass="dataList" value="{! TenderProjects}" var="tp" rendered="{!TenderProjects.size > 0}">  
                <apex:column headerValue="比选名称" styleClass="width_20" id="theColumn">
                    <apex:outputLink value="/TenderProjectDetail?id={! tp.Id}" id="link">{! tp.Name}</apex:outputLink>
                </apex:column>
                <apex:column value="{! tp.Selection_Ratio__c}" styleClass="width_20" />  
                <apex:column value="{! tp.Selection_Type__c}" styleClass="width_20" /> 
                <apex:column value="{! tp.Tender_Stage__c}" styleClass="width_20" />  
                <apex:column value="{! tp.CreatedDate}" styleClass="width_20" />  
            </apex:pageBlockTable> 
            <apex:outputPanel styleClass="noData" layout="block" rendered="{!TenderProjects.size = 0}">暂无数据</apex:outputPanel>
            <!-- Pagination --> 
            <apex:outputPanel rendered="{!TenderProjects.size > 0}">
                <table style="width: 100%">  
                    <tr>  
                        <td style="float: left;width: 150px;">  
                            <!-- Page X of Y -->  
                            <!-- PageNumber:当前页面所在位置,ResultSize:记录总条数,Size:每页记录条数 -->  
                            第 <apex:outputText value="{! PageNumber}/{! CEILING(ResultSize / Size)}" /> 页
                        </td>  
                        <td align="center" style="width: 100%;text-indent: -150px;">  
                            <!-- Previous Page -->  
                            <!-- active -->  
                            <apex:commandLink action="{! Previous}" value="« 上一页" rendered="{! HasPrevious}" />  
                            <!-- 如果没有上一页就用文本显示,不使用带action的链接 -->  
                            <apex:outputText style="color:#ccc;" value="« 上一页" rendered="{! NOT(HasPrevious)}" />  
                                
                            <!-- Next Page --> 
                               
                            <!-- active -->  
                            <apex:commandLink action="{! Next}" value="下一页 »" rendered="{! HasNext}" />  
                            <!-- 如果没有下一页就用文本显示,不使用带action的链接 -->  
                            <apex:outputText style="color: #ccc;" value="下一页 »" rendered="{! NOT(HasNext)}" />  
                        </td>  
                        <!-- 更改每页记录数,默认为25 -->
                        <!-- <td align="right">  
                            每页记录条数:
                            <apex:selectList value="{! size}" size="1">  
                                <apex:selectOptions value="{!paginationSizeOptions}"/>
                                <apex:actionSupport event="onchange" reRender="TenderProject" action="{!refreshPageSize}" />  
                            </apex:selectList>  
                        </td>  --> 
                    </tr>  
                </table> 
            </apex:outputPanel> 
        </apex:pageBlock>  
    </apex:form> 
    <script type="text/javascript">
        var j$ = jQuery.noConflict();  
        j$(document).ready(function() {
            var accId = sessionStorage.getItem('loginAccID');
            j$('a[id*=link]').click(function() {
                if(accId != null) {
                    var href = j$(this).attr('href');
                    j$(this).attr('href', href+'&accId='+accId);
                }
            });
        });
    </script> 
</apex:page>
2. Apex Code:
/**********************************************************************
*Name:招标信息公示页面控制器
*Description:自定义招标信息公示页面分页,广告商可以自行选择每页展示记录条数,并能按照记录类型过滤记录,只有定向谈判的供应商才能看到与自己相关的比选项目。
======================================================
History                                                            
-------                                                            
VERSION  AUTHOR         DATE            DETAIL                                
1.0      Wilson Xu      2017-05-22      Created
2.0      Wilson Xu      2017-06-23      Modified
***********************************************************************/ 
public class TenderInformationPublicityController {
    public static final Integer DEFAULT_PAGE_SIZE = 25;
    public Integer size {get;set;} 
    public String filterId {get;set;}
    public List<SelectOption> listViewOptions {get;set;}
    public List<Tender_Project__c> tpList;
    public Set<Id> tpIds;
    public String query;


    // 在构造函数初始化每页展示的记录数
    public TenderInformationPublicityController() {
        // 查询所有已经发布并不包含定向谈判比选方式的比选项目记录
        query = 'SELECT Id, Name, Selection_Ratio__c, Selection_Type__c, Tender_Stage__c, CreatedDate, Is_Published__c ' +
                'FROM Tender_Project__c ' +
                'WHERE Is_Published__c = true AND Selection_Ratio__c != \'定向谈判\' ' +  
                'ORDER BY CreatedDate DESC ' + 
                'LIMIT 500';
        // 初始化比选项目记录
        tpList = Database.query(query);

        // 初始化tpIds变量
        tpIds = new Set<Id>();
        for(Tender_Project__c tp : tpList) {
            tpIds.add(tp.Id);
        }
        System.debug('已经发布且比选方式不为定向谈判的比选项目Id集合:' + tpIds);

        size = DEFAULT_PAGE_SIZE;
        // paginationSizeOptions = new List<SelectOption>();
        // paginationSizeOptions.add(new SelectOption('15','15'));
        // paginationSizeOptions.add(new SelectOption('25','25'));
        // paginationSizeOptions.add(new SelectOption('30','30'));

        listViewOptions = new List<SelectOption>();
        listViewOptions.add(new SelectOption('none', '--全部--'));
        List<RecordType> items = [SELECT Name, Id 
                                  FROM RecordType 
                                  WHERE SObjectType = 'Tender_Project__c' AND isActive = true AND Name LIKE '%普通'
                                  LIMIT 100];
        for(RecordType item : items) {
            listViewOptions.add(new SelectOption(item.Id, item.Name));
        }
    }

    // 通过query locator实例化标准控制器
    public ApexPages.StandardSetController setCon {
        get {
            if(setCon == null) {
                setCon = new ApexPages.StandardSetController(Database.getQueryLocator(query));
            }
            setCon.setPageSize(size);
            return setCon;
        }
        set;
    }

    // 返回自定义对象Tender_Project__c的List数据集合
    public List<Tender_Project__c> getTenderProjects() {
        return (List<Tender_Project__c>)setCon.getRecords();
    }

    // 返回页面是否有下一页布尔值
    public Boolean hasNext {
        get {
            return setCon.getHasNext();
        }
        set;
    }
    
    // 返回页面是否有上一页布尔值
    public Boolean hasPrevious {
        get {
            return setCon.getHasPrevious();
        }
        set;
    }
    
    // 返回当前记录的页面数
    public Integer pageNumber {
        get {
            return setCon.getPageNumber();
        }
        set;
    }

    // 返回记录的总条数
    public Integer resultSize {
        get {
            return setCon.getResultSize();
        }
        set;
    }
    
    // 返回上一页记录
    public void previous() {
        setCon.previous();
    }
    
    // 返回下一页记录
    public void next() {
        setCon.next();
    }
    
    // 改变每一页显示的记录条数
    // public PageReference refreshPageSize() {
    //     system.debug('page size:' + size);
    //     setCon.setPageSize(size);
    //     return null;
    // }

    // 改变每一页显示的记录条数
    public PageReference refreshPage() {
        size = DEFAULT_PAGE_SIZE;// 只要改变了recordType picklist的值就重置下pageSize的值
        if(filterId == 'none') {
            setCon = new ApexPages.StandardSetController(Database.getQueryLocator(query));
        }else {
            // 查询指定的recordType记录|注意filterId写法
            String filterQuery = 'SELECT Id, RecordTypeId, Name, Selection_Ratio__c, Selection_Type__c, Tender_Stage__c, CreatedDate, Is_Published__c ' +
                                 'FROM Tender_Project__c ' +
                                 'WHERE RecordTypeId = :filterId AND Id IN :tpIds ORDER BY CreatedDate DESC ' + 
                                 'LIMIT 500';
            setCon = new ApexPages.StandardSetController(Database.getQueryLocator(filterQuery));
        }
        System.debug('filterId:' + filterId);
        return null;
    }
}
3. Test Class Code:
@isTest
private class TenderInformationPublicityControllerTest {
    static testMethod void testInfoPublicity() {
    	Test.startTest();
    	List<Tender_Project__c> tpList = new List<Tender_Project__c>();
    	Account acc = new Account(
    		Name = '供应商1',
    		Approval_Status__c = '	审核通过'
    	);
    	insert acc;

        Tender_Project__c tp1 = new Tender_Project__c(
        	Name = '比选1',
        	Selection_Ratio__c = '普通', 
        	Selection_Type__c = '展览展示', 
        	Compare_Stage__c = '项目立项', 
        	RecordTypeId = Schema.SObjectType.Tender_Project__c.getRecordTypeInfosByName().get('展览展示-普通').getRecordTypeId(),
        	Is_Published__c = true
        );
        insert tp1;
        // tpList.add(tp1);

        Tender_Project__c tp2 = new Tender_Project__c(
        	Name = '比选2',
        	Selection_Ratio__c = '普通', 
        	Selection_Type__c = '事件行销', 
        	Compare_Stage__c = '项目立项', 
        	RecordTypeId = Schema.SObjectType.Tender_Project__c.getRecordTypeInfosByName().get('事件行销-普通').getRecordTypeId(),
        	Is_Published__c = true
        );
        insert tp2;
        tpList.add(tp1);
        tpList.add(tp2);

        // 插入应标记录

    	Advertiser_Tender_Relationship__c atr1 = new Advertiser_Tender_Relationship__c(
    		Account__c = acc.Id,
        	Tender_Project__c = tp1.Id
    	);
    	insert atr1;

    	Advertiser_Tender_Relationship__c atr2 = new Advertiser_Tender_Relationship__c(
    		Account__c = acc.Id,
        	Tender_Project__c = tp2.Id
    	);
    	insert atr2;

    	PageReference pageRef = Page.TenderInformationPublicity;
    	Test.setCurrentPage(pageRef);

        TenderInformationPublicityController tpc = new TenderInformationPublicityController();
        tpc.size = 2;
        tpc.getTenderProjects();
        tpc.filterId = tp1.RecordTypeId;
        tpc.refreshPage();
        
        boolean hn = tpc.hasNext;
        boolean hp = tpc.hasPrevious;
        Integer pn = tpc.pageNumber;
        Integer rs = tpc.resultSize;
        tpc.next();
        tpc.previous();

        Test.stopTest();


    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值