Pregunta

Estoy viendo algo de comportamiento en el código Apex de Salesforce que no entiendo. Parece romper las reglas de seguridad del código. Tengo un controlador que se parece a esto:

public with sharing class CaseController {

    //Properties
    public Case TheCase { get; private set; }

    //
    //Constructor
    public CaseController(ApexPages.StandardController controller) {
        //Some unimportant stuff
    }

    //
    //Validates all data coming in from the view and saves the case
    public PageReference Save() {
        //Some other unimportant stuff
    }
 }

Y una prueba que se parece a esto:

private static testMethod void Save_WithCompleteCase_SavesCase() 
{
    //Given
    User user = GetTestUser('Standard User');
    Product2 theProduct = GetTestProduct();
    Case theCase = GetTestCase(user, theProduct);

    System.runAs(user) {

        //When
        CaseController controller = new CaseController(new ApexPages.StandardController(theCase));
        controller.TheCase.Subject = 'Test Case'; //Making a change to test it saved
        PageReference page = controller.Save();

        //Then

    }
 }

Tenga en cuenta que mi controlador tiene un setter privado en "TheCase", pero puedo cambiar su valor en la clase de prueba. Este código funciona y es procesado por Salesforce. ¿Por qué? ¿Hay algo especial en las clases de prueba que les permitan acceder a miembros privados de otras clases?

¡¡Gracias!!

¿Fue útil?

Solución

Duh, no estaba pensando claramente antes. El setter es privado en la propiedad del caso en sí, pero las propiedades del caso, como el sujeto, aún son accesibles públicamente.

Hacer que el conjunto privado de la propiedad del caso solo proteja al controlador de que el caso cambie de debajo de él.

¡¡Lo siento!!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top