Как мне избежать STANDARD_PRICE_NOT_DEFINED при модульном тестировании OpportunityLineItem в Apex v24.0? - PullRequest
20 голосов
/ 06 февраля 2012

Очевидно, что новой особенностью выпуска Apex Spring '12 / v24.0 в Salesforce.com является то, что модульные тесты больше не имеют доступа к «реальным» данным - таким образом (если я правильно понимаю изменение)SOQL-запрос теперь будет извлекать только те объекты, которые были вставлены в ходе модульного теста - и даже на него распространяются некоторые ограничения.

В любом случае это, похоже, приводит к отказу от тестирования OpportunityLineItem из окна, потому что:

  • Невозможно вставить элемент OpportunityLineItem без PriceBookEntryId, НО
  • Невозможно вставить новую запись в прайс-листе для продукта X, если у вас уже нет записи в книге стандартных цен дляпродукт X, НО
  • В данных теста нет стандартной книги цен, потому что таблица Pricebook2, как и все таблицы, фактически пуста в начале запуска модульного теста, И
  • Невозможно создать книгу стандартных цен в Apex

Я действительно надеюсь, что получил хотя бы одну из этих четырех точекЭто неправильно, но до сих пор никакие изменения в моих существующих модульных тестах не показали, что какой-либо из них был ошибочным.Что, конечно, означает, что мои юнит-тесты больше не работают.Это произошло буквально за одну ночь - в пятницу тесты в моей песочнице прошли нормально, а теперь они провалились.

Я что-то упустил или это ошибка в новом выпуске SFDC?

Ответы [ 5 ]

14 голосов
/ 17 сентября 2014

В Summer 14 появилась новая функциональность, теперь вы можете использовать Test.getStandardPricebookId() для получения стандартного идентификатора прайс-листа, не устанавливая SeeAllData в True.

12 голосов
/ 07 февраля 2012

Во-первых, чтобы успокоить ваш разум, не планируется отказываться от флага seeAllData.Мы не собираемся вытаскивать коврик из-под вас.Что касается создания стандартной книги цен в апекс-тесте, я не уверен.Я уверен, что есть несколько областей, в которых тестирование без существующих данных сегодня затруднительно на платформе, и это одна из причин, по которой присутствует флаг seeAllData.Мы постараемся закрыть эти пробелы в следующих выпусках.

3 голосов
/ 07 марта 2013

Я только что натолкнулся на это, и хотя ваш пост устарел, это первый результат в Google, поэтому я решил поделиться тем, что сделал.

Моя базовая архитектура - это тестовый класс, который вызывает вспомогательный класс для создания тестовых данных на лету (есть другие способы, это моя привычка).

Короткая версия:

  • установить для всех данных значение true
  • убедитесь, что книга стандартных цен активна
  • добавить запись в книгу цен для стандартной книги цен - пометить как активную
  • добавить запись в прайс-лист для вашей книги тестовых цен - пометить как активную

Тестовый класс:

@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;
}
1 голос
/ 09 февраля 2012

Другим обходным решением будет информирование вашего триггера о том, что он запускается в тесте с использованием Test.isRunningTest (), но я думаю, что это решение не соответствует рекомендациям, которые, как мне кажется, и являются смыслом изоляции тестов. из ранее существующих данных.

Возможно, Salesforce может сделать поле Pricebook2.isStandard доступным для записи, если код выполняется в контексте теста или для конкретной записи стандартной книги цен должен быть присвоен тот же статус, что и для пользователя и профиля ??

0 голосов
/ 16 ноября 2015
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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...