function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
SandeepbvSandeepbv 

before delete trigger test class

Hello guys,

I am a beginner and stuck at a simple test class for before delete trigger. Please help me what I am doing wrong.

Trigger code:
trigger NewRandomNumber on Random_Number__c (before delete) {
	Random_Number__c num = New Random_Number__c();

    Integer n = Math.round((100000 + Math.random() * 900000));
	num.Random_number__c = n; 
    
	insert num;
    
}

Test class:
@isTest 

public class TestRandomNumber {
	static testMethod void insertNewRandomNumber() {
        Random_Number__c num = New Random_Number__c();
        Integer n = 624575;
        num.Random_number__c = n;
         test.startTest();

        //insert random number
        insert num;
        
    	test.stopTest();
        
        
        //retrieve the new random number
        num = [SELECT Random_number__c FROM Random_number__c WHERE Id =:num.Id];
       System.debug('New number after delete trigger : ' + num.Random_number__c);
 
       // Test that the trigger correctly updated the number
       System.assertEquals(624575, num.Random_number__c);
   }
}

I tried to cover test for every line of code, but it seems I am doing something wrong as Itis showing 0% of test coverage.
Raj VakatiRaj Vakati
Modify code little like show below. It looks good, I would say follow some testing standards.
Random_Number__c num = New Random_Number__c();
        Integer n = 624575;
        num.Random_number__c = n;
        insert num;

		test.startTest();
      delete num ; 
    	test.stopTest();

 
 
Charisse de BelenCharisse de Belen
Hi Jas,

Your trigger is a before delete trigger on the Random_Number__c object, but you are not deleting any Random_Number__c objects in your test. To test your trigger, be sure to include a delete statement in your test class.
SandeepbvSandeepbv
Thanks for reply,

I am little confused about where the delete statement should be added. Does it need it to be in the beginning so that before delete trigger is executed? Or, the position does not matter as long as delete statement is added.
Charisse de BelenCharisse de Belen
In the test class from your original post, you will want to replace lines 5-13 with the code that Rajamohan.Vakati provided. 

One thing to know about test classes is that they do not use any existing data. So at the beginning of the test class, it is as if no data exists. That means you need to create test data. That is what lines 1-4 in Raj's code is doing. Then, to test your trigger, you need to delete the record you just created. That is line 7 in Raj's code.

I just want to clarify... your trigger is inserting a new Random_Number__c record into the database every time a Random_Number__c record is deleted. Are you sure this is what you want?
SandeepbvSandeepbv
yes, I want to insert new number every time records get deleted.

I am calling generateNewRandomNumber from custom button javascript. It basically gets the 1st value from random numbers and then delete it. So, then I want a trigger to run, and insert new random number.


I am getting following error now in:
Class.TestRandomNumber.insertNewRandomNumber: line 18, column 1
Error: System.QueryException: List has no rows for assignment to SObject
 
@isTest 

public class TestRandomNumber {
	static testMethod void insertNewRandomNumber() {
        Random_Number__c num = New Random_Number__c();
        Integer n = 624575;
        num.Random_number__c = n;
        
        //insert random number
        insert num;
        
        test.startTest();
      	delete num ;
        test.stopTest();

        
        //retrieve the new random number
        num = [SELECT Random_number__c FROM Random_number__c WHERE Id =:num.Id];
       System.debug('New number after delete trigger : ' + num.Random_number__c);
 
       // Test that the trigger correctly updated the number
       System.assertEquals(624575, num.Random_number__c);
   }
}


 
Amit Chaudhary 8Amit Chaudhary 8
Hi
I will recommend you to start using trailhead to learn about test classes
1) https://trailhead.salesforce.com/modules/apex_testing

Also please check below post
1) https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_qs_test.htm
2) https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_example.htm
3) http://amitsalesforce.blogspot.com/2015/06/best-practice-for-test-classes-sample.html

You write a test class for this the same way that you would any other:

- Set up some data for the Trigger to access (in this case it looks like Random_Number__c)
- Instantiate the Trigger- by deleting Random_Number__crecord
- Execute a method/methods
- Verify the behaviour with asserts.

Please try below code in your code
@isTest 
public class TestRandomNumber 
{
	static testMethod void insertNewRandomNumber() 
	{
        Random_Number__c num = New Random_Number__c();
        Integer n = 624575;
        num.Random_number__c = n;

		test.startTest();

			insert num;
			
			num = [SELECT Random_number__c FROM Random_number__c WHERE Id =:num.Id];
			System.debug('New number after delete trigger : ' + num.Random_number__c);
			System.assertEquals(624575, num.Random_number__c);
        
			Delete num;
			
    	test.stopTest();
		
		List<Random_number__c> lstRan = [select id from Random_number__c];
		System.assertEquals( lstRan.size() , 0 );
	}
}
Please follow below salesforce Best Practice for Test Classes :-

1. Test class must start with @isTest annotation if class class version is more than 25
2. Test environment support @testVisible , @testSetUp as well
3. Unit test is to test particular piece of code working properly or not .
4. Unit test method takes no argument ,commit no data to database ,send no email ,flagged with testMethod keyword .
5. To deploy to production at-least 75% code coverage is required
6. System.debug statement are not counted as a part of apex code limit.
7. Test method and test classes are not counted as a part of code limit
9. We should not focus on the  percentage of code coverage ,we should make sure that every use case should covered including positive, negative,bulk and single record .
Single Action -To verify that the the single record produces the correct an expected result .
Bulk action -Any apex record trigger ,class or extension must be invoked for 1-200 records .
Positive behavior : Test every expected behavior occurs through every expected permutation , i,e user filled out every correctly data and not go past the limit .
Negative Testcase :-Not to add future date , Not to specify negative amount.
Restricted User :-Test whether a user with restricted access used in your code .
10. Test class should be annotated with @isTest .
11 . @isTest annotation with test method  is equivalent to testMethod keyword .
12. Test method should static and no void return type .
13. Test class and method default access is private ,no matter to add access specifier .
14. classes with @isTest annotation can't be a interface or enum .
15. Test method code can't be invoked by non test request .
16. Stating with salesforce API 28.0 test method can not reside inside non test classes .
17. @Testvisible annotation to make visible private methods inside test classes.
18. Test method can not be used to test web-service call out . Please use call out mock .
19. You can't  send email from test method.
20.User, profile, organization, AsyncApexjob, Corntrigger, RecordType, ApexClass, ApexComponent ,ApexPage we can access without (seeAllData=true) .
21. SeeAllData=true will not work for API 23 version eailer .
22. Accessing static resource test records in test class e,g List<Account> accList=Test.loadData(Account,SobjectType,'ResourceName').
23. Create TestFactory class with @isTest annotation to exclude from organization code size limit .
24. @testSetup to create test records once in a method  and use in every test method in the test class .
25. We can run unit test by using Salesforce Standard UI,Force.com IDE ,Console ,API.
26. Maximum number of test classes run per 24 hour of period is  not grater of 500 or 10 multiplication of test classes of your organization.
27. As apex runs in system mode so the permission and record sharing are not taken into account . So we need to use system.runAs to enforce record sharing .
28. System.runAs will not enforce user permission or field level permission .
29. Every test to runAs count against the total number of DML issued in the process .


Please let us know if this post will help you

 
Amit Chaudhary 8Amit Chaudhary 8
NOTE :- you are getting this issue because you are trying to fatch same record which you delete in your test class. (WHERE Id =:num.Id)
 
test.startTest();
      	delete num ;
        test.stopTest();

        
        //retrieve the new random number
        num = [SELECT Random_number__c FROM Random_number__c WHERE Id =:num.Id];
       System.debug('New number after delete trigger : ' + num.Random_number__c);

NOTE:- Your Trigger is creating new record. So please remove Where id=:num.Id and try like below
 
List<Random_number__c> lstRan = [select id from Random_number__c];
		System.assertEquals( lstRan.size() , 0 );

Let us know if this will help you


 
SandeepbvSandeepbv
Thanks for help,

There is still error when trying to test.

ClassTestRandomNumber
Method NameinsertNewRandomNumber
Pass/FailFail
Error MessageSystem.AssertException: Assertion Failed: Expected: 1, Actual: 0
Stack TraceClass.TestRandomNumber.insertNewRandomNumber: line 23, column 1
Amit Chaudhary 8Amit Chaudhary 8
Just add 1 in assert like below
List<Random_number__c> lstRan = [select id from Random_number__c];
		System.assertEquals( lstRan.size() , 1 );

Full code
@isTest 
public class TestRandomNumber 
{
	static testMethod void insertNewRandomNumber() 
	{
        Random_Number__c num = New Random_Number__c();
        Integer n = 624575;
        num.Random_number__c = n;

		test.startTest();

			insert num;
			
			num = [SELECT Random_number__c FROM Random_number__c WHERE Id =:num.Id];
			System.debug('New number after delete trigger : ' + num.Random_number__c);
			System.assertEquals(624575, num.Random_number__c);
        
			Delete num;
			
    	test.stopTest();
		
		List<Random_number__c> lstRan = [select id from Random_number__c];
		System.assertEquals( lstRan.size() , 1 );
	}
}

Let us know if this will help you