0

私はコーディングの経験が比較的浅く、これまでテスト クラスの作成を強制されたことはありません。概念的にわかりません。次のトリガーを作成しました。

trigger CreateNewInvoiceAndUpdateCM on CampaignMember(after insert, after update){
for (CampaignMember cm: trigger.new){

    if(cm.Status == 'Needs Renewal and Invoice'){
        Asset memb = [SELECT Id, Product2Id FROM Asset WHERE Id = :cm.Membership__c];
        Product2 prod = [SELECT Id, ProductCode FROM Product2 WHERE Id = :memb.Product2Id];
        Pricebook2 pb =[SELECT Id, Name FROM Pricebook2 WHERE Name = 'Standard Price Book'];
        PricebookEntry pbe = [SELECT Id, UnitPrice, Pricebook2Id, Product2Id FROM PricebookEntry WHERE Pricebook2Id = :pb.Id AND Product2Id = :prod.Id];

        Invoice__c inv = new Invoice__c();
        inv.Membership__c = cm.Membership__c;
        inv.Contact__c = cm.ContactId;
        inv.Price__c = pbe.UnitPrice;
        insert inv;



        CampaignMember newCm = [select Id, Invoice__c FROM CampaignMember WHERE Id = :cm.Id];
        newCm.Invoice__c = inv.Id;
        newCM.Status = 'Needs Renewal';
        update newCm;

        }}
        }

しかし、テストクラスを適切に書く方法がわかりません。Salesforce サイトのすべてのドキュメントとここへの無数の投稿に目を通しましたが、コード カバレッジを 13% (2/15) から上げることができませんでした [これはどういう意味ですか?]。

私が書いたテストクラスは基本的に、コードカバレッジが上がることを期待してそこにすべてを入れようとする試みです. テストクラスで実際に何をすべきかわかりません:

@isTest 

private class testCreateNewInvoiceAndUpdateCM{

static testMethod void testCreateNewInvoiceAndUpdateCM(){

PricebookEntry pbe = new PriceBookEntry();
pbe.UnitPrice = 2;

Campaign camp = new Campaign();
camp.Name = 'Test Campaign';
insert camp;

Account acc = new Account();
acc.Name ='Test Account';
insert acc;

Contact cont= new Contact();
cont.LastName = 'LastName';
cont.AccountId = acc.Id;
insert cont;


Asset ass = new Asset();
ass.Name = 'Test Asset';
ass.Membership_Start_Date__c = System.today();
ass.ContactId = cont.Id;
ass.AccountId = ass.Id;
insert ass;

Invoice__c inv = new Invoice__c();
inv.Membership__c = ass.Id;
inv.Contact__c = cont.Id;
inv.Price__c = pbe.UnitPrice;
insert inv;

CampaignMember cm = new CampaignMember(); 
cm.CampaignId = camp.Id;
cm.ContactId = cont.Id;
cm.Membership__c = ass.Id;
cm.Status = 'Needs Renewal and Invoice';
cm.Invoice__c = Inv.Id;

insert cm;


CampaignMember cm2 = [select Id, Status, Invoice__c  from CampaignMember where Id = :cm.Id];
System.assertEquals('Needs Renewal and Invoice',cm.Status);







   }
}

誰か私を助けてくれませんか?

4

2 に答える 2

1

テスト クラスを作成する前に、トリガーを書き直す必要があります。for ループ内では決してクエリを実行しないでください。また、結合を使用してクエリの数を最小限に抑える必要があります。Apex のベスト プラクティス ガイドを確認する必要があります。ここから始める:

http://wiki.developerforce.com/page/Apex_Code_Best_Practices

于 2013-12-17T18:04:20.377 に答える