-1

Apex でワーキング クラスを作成しました。これは、受信メールを処理するメール サービス エクステンダーです。私のサンドボックス環境で完璧に機能しています。

テストクラスを作成したので、それを本番環境にデプロイすることもできますが、コードを検証すると、コードの 72% しかテストされていません。

これが私のメインクラスです

global class inboundEmail implements Messaging.InboundEmailHandler {

global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
    Messaging.InboundEmailResult result = new Messaging.InboundEmailresult();

Lead lead;

String [] mFromUserParams;
String [] sourceText;
String mCaseObject; 

try{
    sourceText = email.toAddresses[0].split('@');
    String [] mParams = sourceText[0].split('\\.');
**// FROM THIS LINE TO THE END - NOT COVERED**
    mFromUserParams = email.fromAddress.split('@');
    mCaseObject = mParams[0];
    if (mCaseObject == 'lead'){
        lead = new Lead();
        lead.LastName = mFromUserParams[0];
        lead.Company = email.fromAddress;
        lead.OwnerId = mParams[1];
        lead.LeadSource = mParams[2];
        lead.Email = email.fromAddress;
        lead.RequirementsDescription__c = email.subject + email.plainTextBody;

        insert lead;
        result.success = true;
    }  else if (mCaseObject == 'case'){
        result.success = true;
    }  else {
        result.success = false;
    }
}catch(Exception e){
    result.success = false;
    result.message = 'Oops, I failed.';
}
return result;
}
}

これは私のテストクラスです

@isTest
private class inboundEmailTest {
public static testMethod void inboundEmail(){     
    // Create a new email, envelope object and Header
    Messaging.InboundEmail email = new Messaging.InboundEmail();
    Messaging.InboundEnvelope envelope = new Messaging.InboundEnvelope();
envelope.toAddress = 'lead.owner.new@cpeneac.cl.apex.sandbox.salesforce.com';
    envelope.fromAddress = 'user@acme.com';
    email.subject = 'Please contact me';
    email.fromName = 'Test From Name';
    email.plainTextBody = 'Hello, this a test email body. for testing  Bye';
    // setup controller object
    inboundEmail catcher = new inboundEmail();
    Messaging.InboundEmailResult result = catcher.handleInboundEmail(email, envelope);
}
}

エラー メッセージによると、Try/Catch ブロックの 3 行目以降のすべての行がカバーされていません。(コードでマークされています)。

4

3 に答える 3

1

テスト メソッドでは、envelope.toAddress を設定していますが、メール サービスでは、実際の InboundEmail オブジェクトの最初の要素を toAddresses に分割しています。要素 0 が存在しないため、おそらく ArrayIndexOutOfBoundsException または NPE のいずれかが発生します。したがって、テストは常に例外処理にジャンプし、残りのコードはカバーされないままになるため、コード カバレッジは低くなります。メールをアドレスに設定するだけで、カバレッジが向上するはずです。h9nry

于 2012-07-05T15:07:10.457 に答える
0

テスト コードに、リードの挿入が失敗するシナリオを追加できますか? これにより、catch ブロック内のコードが実行され、必要なコード テスト カバレッジが提供されます。

于 2012-07-05T14:25:29.093 に答える
0

email.fromAddress はデフォルトではリストではないため、リストではなく文字列に設定するだけで解決しました。

于 2012-07-08T07:52:37.447 に答える