Impossível testar a tarefa criada em Messaging.sendEmail?

Oct 02 2020

Eu adicionei alguns campos de Conformidade aos objetos EmailMessage e Campaign. Quando um e-mail de lista é enviado, um trabalho em lote encontra as tarefas e copia os campos da campanha relacionados ao e-mail de lista. Da mesma forma, a tarefa em lote também copia esses campos do EmailMessage. (Sim, terei que garantir que essa parte espere um pouco para que os usuários tenham tempo de adicionar informações de conformidade ao EmailMessage.)

A funcionalidade acima funciona bem e meu teste de cobertura do Apex prova com sucesso que as tarefas de e-mail da lista foram atualizadas conforme o esperado com as informações de conformidade.

No entanto, parece impossível escrever um teste de cobertura para provar que a tarefa de email único foi atualizada corretamente.

Dentro de startTest (), eu uso Messaging.sendEmail (), espero 10 segundos com uma função de suspensão que funciona e, em seguida, encontro EmailMessage. Esperançosamente, isso deve garantir que o fluxo oculto do Salesforce que em algum lugar cria a Tarefa realmente seja executado. Em vez disso, acho que EmailMessage.ActivityId é sempre nulo.

Descobri que o Salesforce não envia e-mail durante os testes para evitar spam de pessoas. Embora você possa contar invocações. Isso significa que é impossível localizar tarefas criadas por sendEmail porque elas nunca serão criadas?

Embora eu perca apenas algumas linhas de cobertura, é um problema que não posso forçar a execução do fluxo de criação de tarefas.

Obrigado pela ajuda.

Respostas

3 sfdcfox Oct 02 2020 at 19:48

Existem algumas coisas que são impossíveis de testar no Salesforce. Coisas como histórico de campo e tarefas de e-mail são geradas durante a etapa de "finalização da transação" de uma transação, que ocorre somente depois que a transação foi executada até a conclusão e o Salesforce está pronto para confirmar alterações permanentemente no banco de dados.

Como você observou, isso acontece no final do teste de unidade, depois que tudo o mais aconteceu em seu teste, exceto os testes de unidade, em vez de reverter tudo, exceto os logs de depuração, portanto, não há como realmente observar os dados criados como resultado de um teste de unidade.

Você pode obter a cobertura do código de algumas maneiras, como a API de stub ou extraindo a lógica para um método separado para fins de teste, mas não será capaz de realmente validar a lógica.