5

在 Apex 单元测试中,为什么 MyConrtoller myCont = new MyController(StandardContoller); 调用设置当前页面?

例如,如果我有这个页面:

<apex:page standardController="DB_Object__c" extensions="MyExtension">
  <apex:form id="detail_list">
    <apex:detail />
    <apex:actionStatus id="readStatus">
    <apex:facet name="start">
        Loading, please wait...
   </apex:facet>
    <apex:facet name="stop"><apex:outputPanel >
        <apex:commandButton action="{!readData}"
            value="Update Data"
            rerender="detail_list"
            status="readStatus"/>
        {!remainingRecords}</apex:outputPanel>
    </apex:facet>
   </apex:actionStatus>
   </apex:form>
</apex:page> 

如果我的单元测试创​​建了这个:

DB_Object__c dbObj = new DB_Object__c();
dbObj.Name = 'test';
dbObj.Setting = 'aSetting';
insert dbObj;
Test.setCurrentPageReference(Page.Demo);
ApexPages.StandardController sc = new ApexPages.StandardController(dbObj);
MyExtension myExt = new MyExtension(sc);

为什么会ApexPages.currentPage().getParameters().get('id');失败?我要做:

ApexPages.currentPage().getParameters().put('id',dbObj.id);

如果它不做任何事情,传递dbObjto有什么意义?StandardController您发送的意图是空白对象并且扩展使用此对象吗?似乎没有很多关于 StandardControllers 和单元测试的文档......

谢谢!

4

3 回答 3

2

在测试场景中解决这个问题的一种方法是这样的:

// at first you have to create the object
DB_Object__c dbObj = new DB_Object__c();
dbObj.Name = 'test';
dbObj.Setting = 'aSetting';
insert dbObj;

// then you'd call the vf page with the id query paramter
Test.setCurrentPageReference(Page.Demo);
ApexPages.currentPage().getParameters().put('id', dbObj.Id);
dbObj = [Select All, Fields, You, Need From DB_Object__c Where Id = :ApexPages.currentPage().getParamters().get('id')];

// then the StandardController & controller extension get initiated
ApexPages.StandardController sc = new ApexPages.StandardController(dbObj);
MyExtension myExt = new MyExtension(sc);

现在你的问题为什么会getParameters().get('id')失败?save您可以在没有记录 ID 的情况下启动 StandardController,如果您使用默认的PageReference ,它将为您提供新记录并自动插入记录。

于 2012-08-15T21:51:33.523 回答
0

您的问题的答案是 StandardController 与传递给 visualforce 页面的参数无关。当您了解这一点时,您将更好地了解如何处理您的测试中的 StandardController 对象和查询参数。

当访问页面时抛出浏览器,通过从 url 检索 id 参数来构建 StandardController。以下可能是构建页面的 StandardController 和 Controller Extensions 的步骤。

  1. 从参数列表中检索 Id 参数id=ApexPages.currentPage().getParameters().get('id');
  2. 加载具有给定 ID 的 SobjectMy_Object my_Object=[SELECT Id, Name FROM My_Object WHERE Id = :id]
  3. 通过调用使用给定对象构建标准控制器ApexPages.StandardController sc = new ApexPages.StandardController(my_Object)
  4. 最后,用标准控制器实例化所有控制器扩展 MyExtension myExt = new MyExtension(sc)

从这里,您可以注意到通过传递 sObject 来实例化 StandardController 对象不会自动创建一个查询参数,并将 sObject 的 id 作为参数传递。因此,如果出于测试目的您需要访问查询参数,则必须在执行时将其显式添加到参数列表中ApexPages.currentPage().getParameters().put('id', dbObj.Id);

于 2016-08-30T12:28:22.780 回答
-1

我用它来确定请求是否来自 API 源

String.valueOf(URL.getCurrentRequestUrl()).toLowerCase().contains('services/soap')
于 2012-10-26T00:29:21.240 回答