Unit Testing in Salesforce Apex

Notes on things to remember when writing unit tests for Apex on the Salesforce platform.

Test Data

@IsTest
private class CSV_Tests {
  @TestSetup
  static void loadTestDataFromStaticResource(){
    // NOTE: Assumes that we have created a Static Resource CSV file called accountData
    List<sObject> accounts = Test.loadData(Account.SObjectType, 'accountData');
  }

  @IsTest
  static void testLoadAccountsFromStaticResource() {
    List<Account> accts = [SELECT Id FROM Account];
    System.assert(accts.size() == 3, 'expected 3 accounts');
  }
}

Test.startTest() & Test.stopTest()

Permission-based Testing

@IsTest
private class PermissionsTests {
  @TestSetup
  static void testSetup(){
    Account a = TestFactory.getAccount('No view For You!', true);
    // NOTE: In this case we have a custom object that has a Private Sharing model
    Private_Object__c po = new Private_Object__c(account__c = a.id, notes__c = 'foo');
    insert po;
  }

  @IsTest
  static void negativePermissionSetTest() {
    User u = new User(
      ProfileId = [SELECT Id FROM Profile WHERE Name = 'Standard User'].Id,
      LastName = 'last',
      Email = 'Cpt.Awesome@awesomesauce.com',
      UserName = 'Cpt.Awesome.' + DateTime.now().getTime() + '@awesomesauce.com',
      Alias = 'alias',
      TimeZoneSidKey = 'America/Los_Angeles',
      EmailEncodingKey = 'UTF-8',
      LanguageLocaleKey = 'en_US',
      LocaleSidKey = 'en_US'
    );

    System.runAs(u){
    Private_Object__c[] pos;

    Test.startTest();
    pos = [SELECT Id, Account__c, notes__c FROM Private_Object__c];
    Test.stopTest();

    System.assert(pos.size() == 0, 'a user without the permission set cannot see any records');
    }
  }
}

Tags