Почему я не могу добавить строку с утвержденной записью в заявку CR

Это код Apex Test Class, здесь у меня есть то, что этот класс будет содержать значение жесткого кода, чтобы создать, отправить заявку на утверждение.

Мне было интересно, могу ли я получить какое-либо руководство здесь, так как я не могу получить из другого места. Спасибо за любую предоставленную помощь.

PS. это платформа Salesforce, связанная с Remedyforce.


@isTest

открытый класс Test_CustomRequireRejectionComment {

/*
   create an object for approval, then
    simulate rejecting the approval with an added comment.

    The rejection should be processed normally without being interrupted.
*/
private static testmethod void testRejectionWithComment()
{
    // Generate sample work item using utility method.
    Id testWorkItemId = generateAndSubmitObject();

    // Reject the submitted request, providing a comment.
    Approval.ProcessWorkitemRequest testRej = new Approval.ProcessWorkitemRequest();
    testRej.setComments('Rejecting request with a comment.');
    testRej.setAction  ('Reject');
    testRej.setWorkitemId(testWorkItemId);

    Test.startTest();        
        // Process the rejection
        Approval.ProcessResult testRejResult =  Approval.process(testRej);
    Test.stopTest();

    // Verify the rejection results
    System.assert(testRejResult.isSuccess(), 'Rejections that include comments should be permitted');
    System.assertEquals('Rejected', testRejResult.getInstanceStatus(), 
      'Rejections that include comments should be successful and instance status should be Rejected');
}

/*
    For this test, create an object for approval, then reject the request, then
    without a comment explaining why. The rejection should be halted, and
    and an apex page message should be provided to the user.
*/
private static testmethod void testRejectionWithoutComment()
{
    // Generate sample work item using utility method.
    Id testWorkItemId = generateAndSubmitObject();

    // Reject the submitted request, without providing a comment.
    Approval.ProcessWorkitemRequest testRej = new Approval.ProcessWorkitemRequest();
    testRej.setComments('');
    testRej.setAction  ('Reject');      
    testRej.setWorkitemId(testWorkItemId);

    Test.startTest();        
        // Attempt to process the rejection
        try
        {
            Approval.ProcessResult testRejResult =  Approval.process(testRej);
            system.assert(false, 'A rejection with no comment should cause an exception');
        }
        catch(DMLException e)
        {
            system.assertEquals('Operation Cancelled: Please provide a rejection reason!', 
                                e.getDmlMessage(0), 
              'error message should be Operation Cancelled: Please provide a rejection reason!'); 
        }
    Test.stopTest();
}

/*
    When an approval is approved instead of rejected, a comment is not required, 
    mark the approval status as pending, then ensure that this functionality still holds together.
*/
private static testmethod void testApprovalWithoutComment()
{
    // Generate sample work item using utility method.
    Id testWorkItemId = generateAndSubmitObject();

    // approve the submitted request, without providing a comment.
    Approval.ProcessWorkitemRequest testApp = new Approval.ProcessWorkitemRequest();
    testApp.setComments ('');
    testApp.setAction   ('Approve');
    testApp.setWorkitemId(testWorkItemId);

    Test.startTest();        
        // Process the approval
        Approval.ProcessResult testAppResult =  Approval.process(testApp);
    Test.stopTest();

    // Verify the approval results
    System.assert(testAppResult.isSuccess(), 
                 'Approvals that do not include comments should still be permitted');
    System.assertEquals('Approved', testAppResult.getInstanceStatus(), 
       'All approvals should be successful and result in an instance status of Approved');
}

/*
    Put many objects through the approval process, some rejected, some approved,
    some with comments, some without. Only rejctions without comments should be
    prevented from being saved.
*/
private static testmethod void testBatchRejctions()
{
    List<BMCServiceDesk__Change_Request__c> testBatchIS = new List<BMCServiceDesk__Change_Request__c>{};
    for (Integer i = 0; i < 200; i++)
    {
        testBatchIS.add(new BMCServiceDesk__Change_Request__c());           
    }   

    insert testBatchIS;

    List<Approval.ProcessSubmitRequest> testReqs = 
                     new List<Approval.ProcessSubmitRequest>{}; 
    for(BMCServiceDesk__Change_Request__c testinv : testBatchIS)
    {
        Approval.ProcessSubmitRequest testReq = new Approval.ProcessSubmitRequest();
        testReq.setObjectId(testinv.Id);
        testReqs.add(testReq);
    }

    List<Approval.ProcessResult> reqResults = Approval.process(testReqs);

    for (Approval.ProcessResult reqResult : reqResults)
    {
        System.assert(reqResult.isSuccess(), 
                      'Unable to submit new batch invoice statement record for approval');
    }

    List<Approval.ProcessWorkitemRequest> testAppRejs 
                                              = new List<Approval.ProcessWorkitemRequest>{};

    for (Integer i = 0; i < 50 ; i++)
    {
        Approval.ProcessWorkitemRequest testRejWithComment = new Approval.ProcessWorkitemRequest();
        testRejWithComment.setComments  ('Rejecting request with a comment.');
        testRejWithComment.setAction    ('Reject');
        testRejWithComment.setWorkitemId(reqResults[i*4].getNewWorkitemIds()[0]);

        testAppRejs.add(testRejWithComment);

        Approval.ProcessWorkitemRequest testRejWithoutComment = new Approval.ProcessWorkitemRequest();
        testRejWithoutComment.setAction    ('Reject');
        testRejWithoutComment.setWorkitemId(reqResults[(i*4)+1].getNewWorkitemIds()[0]);

        testAppRejs.add(testRejWithoutComment);

        Approval.ProcessWorkitemRequest testAppWithComment = new Approval.ProcessWorkitemRequest();
        testAppWithComment.setComments  ('Approving request with a comment.');
        testAppWithComment.setAction    ('Approve');
        testAppWithComment.setWorkitemId(reqResults[(i*4)+2].getNewWorkitemIds()[0]);

        testAppRejs.add(testAppWithComment);

        Approval.ProcessWorkitemRequest testAppWithoutComment = new Approval.ProcessWorkitemRequest();
        testAppWithoutComment.setAction    ('Approve');
        testAppWithoutComment.setWorkitemId(reqResults[(i*4)+3].getNewWorkitemIds()[0]);

        testAppRejs.add(testAppWithoutComment);            
    }

    Test.startTest();        
        // Process the approvals and rejections
        try
        {
            List<Approval.ProcessResult> testAppRejResults =  Approval.process(testAppRejs);
            system.assert(false, 'Any rejections without comments should cause an exception');
        }
        catch(DMLException e)
        {
            system.assertEquals(50, e.getNumDml());

            for(Integer i = 0; i < 50 ; i++)
            {
                system.assertEquals((i*4) + 1, e.getDmlIndex(i));
                system.assertEquals('Operation Cancelled: Please provide a rejection reason!', 
                                    e.getDmlMessage(i));
            }
        }    
    Test.stopTest();
}

/*
    Utility method for creating single object, and submitting for approval.

    The method should return the Id of the work item generated as a result of the submission.

    ***Include required field and set status.
*/
private static Id generateAndSubmitObject()
{
    // Create a sample object and then submit it for approval.
    BMCServiceDesk__Change_Request__c testIS = new BMCServiceDesk__Change_Request__c();
    testIS = [Select Id From BMCServiceDesk__Change_Request__c Where Name ='CR00002135'];

    insert testIS;

    Approval.ProcessSubmitRequest testReq = new Approval.ProcessSubmitRequest();
    testReq.setObjectId(testIS.Id);
    Approval.ProcessResult reqResult = Approval.process(testReq);

    System.assert(reqResult.isSuccess(),'Unable to submit new invoice statement record for approval');

    return reqResult.getNewWorkitemIds()[0];
}

}


после запуска тестового класса я получил сообщение об ошибке,

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[Представление] 0:00 Test_CustomRequireRejectionComment testApprovalWithoutComment Сбой System.QueryException: в списке нет строк для назначения SObject Class.Test_CustomRequireRejectionComment.generateAndSubmitObject: строка 187, столбец 1 Class.Test_CustomRequireReomumn: column.commentmentomment: column.commentomment: column.CommentCommentCommentCommentCommentCommentCommentCommentCommentCommentCommentCommentCommentCommentCommentComment: столбец 1: Class.Ttest_CustomRequireCommentCommentCommentCommentCommentComment: столбец 1 Class.Test_CustomRequireRecom

[View] 0:18 Test_CustomRequireRejectionComment testBatchRejctions Fail System.DmlException: процесс не выполнен. Первое исключение в строке 0; первая ошибка: NO_APPLICABLE_PROCESS, не найден подходящий процесс утверждения.: [] Class.Test_CustomRequireRejectionComment.testBatchRejctions: строка 115, столбец 1

[View] 0:00 Test_CustomRequireRejectionComment testRejectionWithComment Сбой System.QueryException: в списке нет строк для присвоения SObject Class.Test_CustomRequireRejectionComment.generateAndSubmitObject: строка 187, столбец 1 Class.Test_CustomRequireRejectionCommentCommentComment.test для столбца 1 Class.Test_CustomRequireRejectionCommentComment.test

[Представление] 0:00 Test_CustomRequireRejectionComment testRejectionWithoutComment Сбой System.QueryException: в списке нет строк для назначения SObject Class.Test_CustomRequireRejectionComment.generateAndSubmitObject: строка 187, столбец 1 Class.Test_CustomRequireRejectionCommentCommentCoreComment.test

1 ответ

Решение

Кажется, проблема в вашем статическом методе generateAndSubmitObject(). Есть много странного поведения.

Я собираюсь разбить это построчно.

Строка 1: testIS получает недавно созданный объект BMCServiceDesk__Change_Request__c.

Строка 2: testIS получает список объектов BMCServiceDesk__Change_Request__c (но только поле идентификатора), где Имя равно "CR00002135". Здесь есть две проблемы. Во-первых, это действие делает линию 1 совершенно бесполезной. Во-вторых, это не даст никаких результатов. На данный момент у вас нет CR с именем CR00002135, это ваша база данных.

Строка 3: вы вставляете этот пустой список обратно в базу данных. Это еще одна неоперация.

Остальное должно сработать, если вы исправите строки 1–3. Моя рекомендация: избавьтесь от строки 2 и обновите строку 1, чтобы при создании экземпляра объекта BMCServiceDesk__Change_Request__c он содержал всю необходимую информацию.

Другие вопросы по тегам