2016-05-05 7 views
0

leichte Probleme mit meiner Testklasse herauszufinden, warum System.DmlException: Upsert failed. First exception on row 0; first error: REQUIRED_FIELD_MISSING, Required fields are missing: [Name]: [Name] ZurückkehrenSalesforce Apex Testklasse Failing zum Speichern eines Kontos

Ich habe Feld erforderlich Name auf dem Konto Objekt in SFDC, aber da ich das Konto bin spöttisch Mit einem Namensattribut sollte meine Testklassen-Speicherfunktion nicht funktionieren?

Unten ist meine Apex Klasse Öffentlichkeit mit Sharing-Klasse QuoteAccountController {

// Define VariableType and VariableName 
public ApexPages.StandardController standardContactController; 
public Account Account{get;set;} 
public Contact Contact{get;set;} 
public Account selectedAccount{get;set;} 
public Boolean displayProjectInformation{get;set;} 
public Boolean projectNameError{get;set;} 
public Boolean projectValidationsPassed{get;set;} 

//Page Constructor/Initializer 
public QuoteAccountController(ApexPages.StandardController StandardController) { 
    Account = new Account();  
    Contact = new Contact(); 
    displayProjectInformation = true; 
    projectNameError = false; 
    projectValidationsPassed = true; 
} 

public pageReference save() { 
    projectValidations(); 
    if (projectValidationsPassed) { 
     upsert Account; 
     Contact.accountId = Account.id; 
     upsert Contact; 
     Contact = new Contact(); 
     Account = new Account(); 
     ApexPages.AddMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM,'Record Created Successfully.Thank you!')); 
     return null; 
    } else { 
     return null; 
    } 
} 

public void projectValidations(){ 
    if (Account.Subscription_Type__c == 'Project' && String.isBlank(Account.Project_Name__c)) { 
     projectValidationsPassed = false; 
     ApexPages.AddMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Project Name is required field')); 
    } else if (Account.Subscription_Type__c == 'Project' && String.isBlank(Account.Project_Type__c)) { 
     projectValidationsPassed = false; 
     ApexPages.AddMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Project Type is required field')); 
    } else if (Account.Subscription_Type__c == 'Project' && Account.Project_Start_Date__c == null) { 
     projectValidationsPassed = false; 
     ApexPages.AddMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Project Start Date is required field')); 
    } else if (Account.Subscription_Type__c == 'Project' && Account.Project_End_Date__c == null){ 
     projectValidationsPassed = false; 
     ApexPages.AddMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Project End Date is required field')); 
    } else { 
     projectValidationsPassed = true; 
    } 
} 

Im Folgenden meine Apex Testklasse

@isTest 
public class QuoteAccountControllerTest { 
private static testmethod void testSave() { 
    Quote quote = new Quote(); 
    Account testAcc = new Account(); 
    Contact con = new Contact(); 
    ApexPages.StandardController stdCont = new ApexPages.StandardController(testAcc); 
    QuoteAccountController quoteAccCont = new QuoteAccountController(stdCont); 
    PageReference page = new PageReference('/apex/zqu_QuoteAccount?quoteType=Subscription&stepNumber=1'); 
    Test.setCurrentPage(page); 

    testAcc.Project_Name__c = 'Project Name'; 
    testAcc.Name = 'Test Account'; 
    testAcc.Project_Start_Date__c = Date.today(); 
    testAcc.Project_End_Date__c = Date.today().addDays(2); 
    testAcc.Project_Type__c = 'Convention Center'; 
    testAcc.Region__c = 'US'; 
    testAcc.Subscription_Type__c = 'User'; 

    Test.startTest(); 
    quoteAccCont.save(); 
    Test.stopTest(); 
} 
} 

Dank ist!

Bearbeiten: Fehlermeldung unten.

System.DmlException: Upsert failed. First exception on row 0; first error: REQUIRED_FIELD_MISSING, Required fields are missing: [Name]: [Name] 
+0

Bitte den kompletten Fehler mit Zeilennr. –

+0

@AjaySainy hat eine Fehlermeldung hinzugefügt. Vielen Dank! – Matt16749

Antwort

0

ich nicht zu viel Hintergrund in Salesforce haben, aber ich glaube, dass Sie die Objekte einfügen müssen, die Sie vor Test.startTest mit neuen schaffen();

Wenn dies ebenfalls fehlschlägt, versuchen Sie, System.debug() in Ihrer Apex-Testklasse zu verwenden, und verwenden Sie die Salesforce-Entwicklerkonsole und ihre Protokolle, um Ihren Fehler zu verfolgen. Vielleicht hilft das. Viel Glück!

+0

Danke Jordi. Ich versuche die Erschaffung eines Accounts das erste mal zu testen, welches in diesem Fall eingefügt werden würde also glaube ich nicht das ich es einfügen sollte dann rufe #save – Matt16749

+0

Gern geschehen. In meinem Fall habe ich nur 3 Teststunden mit Hilfe meiner Arbeitskollegen gemacht. Haben Sie versucht, einige Konten Ihrer Organisation mit einer Abfrage zu erhalten? Dies könnte eine andere Möglichkeit sein, Ihre Klasse abzudecken, und Sie vermeiden Feldprobleme zu vermeiden. Dann, sobald Sie es bekommen haben, sollten Sie in der Lage sein, es aufzubieten. –

0

Sie versuchen, upsert ein Konto. Der Upsert-Aufruf (Update/Insert) würde in dem Konto, das Sie hochladen, nach Id suchen. Wenn Id gefunden wird Upsert würde gut funktionieren sonst würde es Insert. Also in Ihrem Fall versucht es, nicht zu aktualisieren. Deshalb ist Name obligatorisch.

+0

Danke für die Überprüfung meiner Anfrage Ajay. In meiner Testklasse stelle ich dem Konto, das ich zu speichern versuche, ein Namensattribut zur Verfügung, also sollte das erforderliche Feld nicht bestehen? testAcc.Name = 'Testkonto'; – Matt16749

+0

Matt, hast du versucht, save Methode aufzurufen. Ich hoffe es wird noch den Fehler werfen. Problem ist nicht in der Testklasse. Da Sie Daten in Ihrer tatsächlichen Klasse erstellen und keine Daten abfragen, bezieht sie sich nicht auf den Datensatz, den Sie in der Testklasse erstellen. –

0

Herausgestellte Lösung. Sie müssen das Konto und den Kontakt dem Controller zuweisen. Siehe den modifizierten Code unten.

@isTest 
public class QuoteAccountControllerTest { 
private static testmethod void testSave() { 
Quote quote = new Quote(); 
ApexPages.StandardController stdCont = new ApexPages.StandardController(testAcc); 
QuoteAccountController quoteAccCont = new QuoteAccountController(stdCont); 
quoteAccCont.Account = new Account(ATTRIBUTES_HERE); 
quoteAccCont.Contact = new Contact(ATTRIBUTES_HERE 
PageReference page = new PageReference('/apex/zqu_QuoteAccount?quoteType=Subscription&stepNumber=1'); 
Test.setCurrentPage(page); 

Test.startTest(); 
quoteAccCont.save(); 
Test.stopTest(); 
} 
}