You need to sign in to do that
Don't have an account?
kgrasu
Why can't I deploy my triggers to prod. that has 95% test coverage?
Hi,
I am trying to deploy a set of Apex Classes and triggers from sandbox to production. Although the apex classes and triggers have >85% test coverage each, when I try to deploy them together using ant , it throws the following exception:
Code:
*** Ending Workflow Evaluation*** Beginning Test 1: AccountScheduler.static testMethod void testAccountScheduler()
System.QueryException: List has no rows for assignment to SObject Class.AccountScheduler.getLocation: line 84, column 25 Class.AccountScheduler.createNew: line 700, column 19 Trigger.TgrAssignmentDupCheck: line 22, column 24 20080805070410.845:Class.AccountScheduler.testAccountScheduler: line 1113, column 5: Insert failed. First exception on row 0;
first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, TgrAssignmentDupCheck: execution of BeforeInsert caused by: System.QueryException: List has no rows for assignment to SObject Class.AccountScheduler.getLocation: line 84, column 25 Class.AccountScheduler.createNew: line 700, column 19 Trigger.TgrAssignmentDupCheck: line 22, column 24 System.Exception: Assertion Failed Class.AccountScheduler.testAccountScheduler: line 1114, column 5 *** Ending Test AccountScheduler.static testMethod void testAccountScheduler()
Two of the apex triggers has a dependency on two of the apex classes as it invokes a method from those two classes.
I have successfully deployed the apex classes to production, but I need help to figure out how I can deploy the triggers to production which currently throws the abovesaid error.
Appreciate all your feedback on this.
Thanks and regards,Rasu
I don't know if that's the case here, but it's usually the reason a test passes in one environment and fails or generates different coverage numbers in another.
In any case, the error you're getting is good because it reveals a flaw in your code, which is that it assumes some query will always return results.
Hi Jon,
Thanks for your reply. The test cases we have in the apex classes and triggers are all dynamic..i.e. it is not hard-coded or referring to any data in the sandbox or production per say. The strange thing is the classess were successfully deployed to production. Also the apex triggers have 90-95 % coverage(with dynamic data creation) but when we run the ant deploy..it fails with the above error. Also I think it has to do something with the dependancy on the Apex classes as the triggers invoke a method from the apex class.
My guess is you have a "SELECT...LIMIT 1" query on this line, and you're assigning the result to a single object (rather than a list). In your dev environment, you have matching records for the "locations" object (or whatever you're querying) but in your production environment your query returns no results, so the test is failing.
From this, I draw the following conclusions:
1) Your code has a bug because you fail to handle the case where this query returns 0 rows
2) Assuming the same tests pass in your dev environment, it means there is something environment-specific that's causing this bug to surface in production but not dev. Every time I've seen this before, it's because a test method is causing records to be retrieved in the dev org that were not inserted at the beginning of the test method. DML statements executed inside a test method context are not committed to the database, so you're expected to insert all the data your tests will touch at the start of the test method, before calling the code to test.
I'm making a lot of assumptions here, but that's all I can do without seeing your code. If you check your code for queries where data from your environment is being pulled into your test, and you fix the bug, and it still doesn't deploy, why don't you post your code here and we'll see what we can do.