2016-06-14 40 views
0

感謝您的閱讀。作爲標準用戶運行批量頂點測試方法

我想寫一個測試方法,運行一個批處理頂點刪除使用標準用戶沒有刪除訪問的情況下,但每當我運行測試,我看到批處理下我目前(管理員)用戶。我錯過了什麼嗎?

這是我的批處理代碼:

global with sharing class BatchDelete implements 
Database.Batchable<sObject>, Database.Stateful { 

// instance member to retain state across transactions 
global Integer recordsProcessed = 0; 

global Database.QueryLocator start(Database.BatchableContext bc) { 
    return Database.getQueryLocator(
     'SELECT ID ' + 
     'FROM Case ' 
    ); 
} 

global void execute(Database.BatchableContext bc, List<Case> scope){ 
    System.debug('---------BATCH----------'); 
    System.debug('Current BATCH User: ' + UserInfo.getUserName()); 
    System.debug('isAccessible: ' + Case.sObjectType.getDescribe().isDeletable()); 
    System.debug('------------------------'); 

    // process each batch of records 
    List<Case> cases = new List<Case>(); 
    for (Case c1 : scope) { 
     cases.add(c1); 
    } 
    delete cases; 
}  

global void finish(Database.BatchableContext bc){ 
    System.debug(recordsProcessed + ' records processed. Shazam!'); 
} } 

而且我的測試方法代碼:

@isTest(SeeAllData=false) 
static void test_readOnlyUser() { 

    UserLicense uL =[SELECT Id,LicenseDefinitionKey,Name FROM UserLicense WHERE Name = 'Salesforce']; 
    Profile p = [SELECT Id FROM Profile WHERE UserLicenseId =: uL.Id AND UserType = 'Standard' 
        AND PermissionsModifyAllData = false AND PermissionsViewAllData = false limit 1 ]; 

    User u = new User(
     UserName = '[email protected]', 
     FirstName = 'Test-First-Name', 
     LastName = 'Test-Last-Name', 
     Alias = 'test', 
     Email = '[email protected]', 
     EmailEncodingKey = 'UTF-8', 
     LanguageLocaleKey = 'en_US', 
     LocalesIdKey = 'en_US', 
     TimezonesIdKey = 'America/Los_Angeles', 
     ProfileId = p.Id 
    ); 

    Case c1 = new Case(); 
    c1.Status = 'New'; 
    insert c1; 

    Test.startTest(); 

    System.runAs(u) { 

     System.debug('---------TEST-----------'); 
     System.debug('Current User: ' + UserInfo.getUserName()); 
     System.debug('isAccessible: ' + Case.sObjectType.getDescribe().isDeletable()); 
     System.debug('------------------------'); 

     BatchDelete myBatchObject = new BatchDelete(); 
     Id batchId = Database.executeBatch(myBatchObject); 
    } 

    Test.stopTest(); 
} } 

回答

0

您需要將您的Test.startTest()Test.stopTest()runAs調用中。這是因爲批處理過程是異步的,所以只能保證在調用Test.stopTest()時執行。

System.runAs(u) { 
    Test.startTest(); 
    //your batch code 
    Test.stopTest(); 
} 
+0

這是正確的解決方案。謝謝。 –