20

显然,Salesforce.com 中 Apex 的 Spring '12 / v24.0 版本的一个新功能是单元测试不再能够访问“真实”数据——因此(如果我正确理解了更改)SOQL 查询将现在只检索在单元测试过程中插入的对象——即使这样也受到一些限制。

无论如何,这似乎将 OpportunityLineItem 测试抛到了窗外,因为:

  • 没有 PriceBookEntryId 就无法插入 OpportunityLineItem,但是
  • 您不能为产品 X 插入新的价格手册条目,除非您已经有产品 X 的标准价格手册条目,但是
  • 测试数据中没有标准价格手册,因为与所有表一样,Pricebook2 表在单元测试运行开始时实际上是空的,并且
  • 无法在 Apex 中创建标准价格手册

我真的希望我在这四点中至少有一个是错误的,但到目前为止,我现有的单元测试没有任何变化表明其中任何一个是错误的。这当然意味着我的单元测试不再起作用。这实际上是在一夜之间发生的——周五在我的沙箱中测试运行良好,但现在它们失败了。

我是否遗漏了什么,或者这是新 SFDC 版本中的错误?

4

5 回答 5

15

Summer 14 引入了新功能,您现在可以使用它Test.getStandardPricebookId()来获取标准价格手册 ID,而无需设置SeeAllDataTrue.

于 2014-09-16T22:53:25.963 回答
12

首先,为了让您放心,我们没有计划弃用 seeAllData 标志。我们不会把地毯从你下面拉出来。至于在顶点测试中创建标准价格手册,我不确定。我敢肯定,在今天的平台上,有几个领域很难在没有现有数据的情况下进行测试,这就是存在 seeAllData 标志的原因之一。我们将在接下来的几个版本中努力缩小这些差距。

于 2012-02-06T22:58:23.600 回答
4

我刚遇到这个,虽然你的帖子很旧,但这是谷歌上的第一个结果,所以我想我会分享我所做的。

我的基本架构是一个测试类,它调用一个实用程序类作为动态创建测试数据的一种方式(还有其他方式,这是我的习惯)。

简洁版本:

  • 设置查看所有数据为真
  • 确保标准价格手册处于活动状态
  • 为标准价格手册添加价格手册条目 - 标记为活动
  • 为您添加价格手册条目测试价格手册 - 标记为活动

测试类:

@isTest (seeAllData=true)
public with sharing class RMA_SelectLineItemsControllerTest {

    static testmethod void testBasicObjects() {
        Pricebook2 standard = [Select Id, Name, IsActive From Pricebook2 where IsStandard = true LIMIT 1];
        if (!standard.isActive) {
            standard.isActive = true;
            update standard;
        }

        Pricebook2 pb = RMA_TestUtilities.createPricebook();
        Product2 prod = RMA_TestUtilities.createProduct();
        PricebookEntry pbe = RMA_TestUtilities.createPricebookEntry(standard,pb,prod);
    }

}

实用程序方法如下所示(仅显示新 PBE 周围的内容):

public static PricebookEntry createPricebookEntry (Pricebook2 standard, Pricebook2 newPricebook, Product2 prod) {
    System.debug('***** starting one');
    PricebookEntry one = new PricebookEntry();
    one.pricebook2Id = standard.id;
    one.product2id = prod.id;
    one.unitprice = 1249.0;
    one.isactive = true;
    insert one;
    System.debug('***** one complete, ret next');
    PricebookEntry ret = new PricebookEntry();
    ret.pricebook2Id = newPricebook.id;
    ret.product2id = prod.id;
    ret.unitprice = 1250.0;
    ret.isactive = true;
    insert ret;
    return ret;
}
于 2013-03-06T22:24:53.133 回答
1

另一种解决方法是让您的触发器知道在使用 Test.isRunningTest() 的测试中运行,但我认为这个解决方案错过了最佳实践的要点,我相信这是使测试与 pre-现有数据。

如果代码在测试上下文中运行,Salesforce 可以使 Pricebook2.isStandard 字段可写,或者特定的标准价格手册记录应该被赋予与用户和配置文件相同的状态?

于 2012-02-09T17:50:46.047 回答
0
Please let me know if anyone has used  Test.getStandardPricebookId() and able to insert opportunity line item in test class. I tried this method with below mentioned code but got an error ": STANDARD_PRICE_NOT_DEFINED, No standard price defined for this product: []".

Note: I have seeAllData=false

ID standardPBID = Test.getStandardPricebookId();

            PriceBook2 pb = new PriceBook2();
            pb.name = 'GEW Water CMS';
            pb.isActive=true;
            insert pb;

Product2 prod= new Product2();
                prod.name='TestProd';
                prod.productcode='4568';
                prod.isActive=true;
                insert prod;



PricebookEntry standardPrice = new PricebookEntry(Pricebook2Id = standardPBID, Product2Id = prod.Id, UnitPrice = 10000, IsActive = true,  currencyISOCode='USD' );

                PriceBookEntry pbe= new PricebookEntry(pricebook2id=pb.id, product2id=prod.id,unitprice=2000, isActive=true, currencyISOCode='EUR');
                insert pbe;

                OpportunityLineItem oli = new OpportunityLineItem(OpportunityId = OppList[0].Id, pricebookentryid=pbe.id, UnitPrice = 100, Quantity = 1);
                insert oli; 
于 2015-11-16T08:32:51.717 回答