es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear una plantilla para la función de anidación en Yii2

Aprendo a utilizar la prueba unitaria en Yii2 con Codeception e intento comprobar si una facturación es una facturación diaria según la configuración de un comerciante.

$this->biller->merchant->detail->rule_type == self::PERIODIC_MODE_DAILY

No sé cómo simular el valor de rule_type si utilizo la función Stub::make().

Lo que he intentado hasta ahora es utilizar un array anidado de esta forma (no funciona):

$billing = Stub::make(Billing::class, [
    'status'           => Billing::STATUS_ACTIVE,
    'set_periodic_by'  => Billing::SET_PERIODIC_BY_MERCHANT,
    'biller'           => [
        'merchant' => [
            'detail' => [
                'rule_type' => Billing::PERIODIC_MODE_DAILY,
            ]
        ]
    ]
]);

También intenté simular cada modelo de objeto utilizando otra función Stub::make():

$billing = Stub::make(Billing::class, [
    'status'           => Billing::STATUS_ACTIVE,
    'set_periodic_by'  => Billing::SET_PERIODIC_BY_MERCHANT,
    'getBiller'        => Stub::make(Biller::class, [
        'getMerchant' => Stub::make(Merchant::class, [
            'getDetail' => Stub::make(MerchantDetail::class, [
                'rule_type' => Billing::PERIODIC_MODE_DAILY,
            ])
        ])
    ])
]);

¿Cómo puedo crear adecuadamente valores de retorno “anidados” utilizando Stub? Cualquier comentario o respuesta es siempre bienvenido.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear correctamente valores de retorno de una función anidada utilizando Stub, puedes utilizar el método expects() en lugar de make(). El método expects() te permite establecer expectativas y valores de retorno para llamadas específicas a métodos. En tu caso, puedes establecer expectativas en la llamada al método getBiller() y devolver un objeto Biller con un objeto Merchant simulado con un objeto MerchantDetail simulado, así:

    $billing = Stub::make(Billing::class, [
        'status' => Billing::STATUS_ACTIVE,
        'set_periodic_by' => Billing::SET_PERIODIC_BY_MERCHANT,
    ]);
    
    $merchantDetail = Stub::make(MerchantDetail::class, [
        'rule_type' => Billing::PERIODIC_MODE_DAILY,
    ]);
    
    $merchant = Stub::make(Merchant::class, [
        'getDetail' => $merchantDetail,
    ]);
    
    $biller = Stub::make(Biller::class, [
        'getMerchant' => $merchant,
    ]);
    
    $billing->expects($this->once())
        ->method('getBiller')
        ->willReturn($biller);
    

    Aquí, primero creamos un objeto Billing simulado. Luego, creamos un objeto MerchantDetail simulado, un objeto Merchant simulado con el método getDetail() simulado para devolver el objeto MerchantDetail, y un objeto Biller simulado con el método getMerchant() simulado para devolver el objeto Merchant.

    Finalmente, establecemos una expectativa en una llamada al método getBiller() del objeto Billing. Utilizamos el método once() para especificar que esperamos que este método sea llamado una vez. Luego, utilizamos el método willReturn() para especificar que el método debe devolver el objeto Biller simulado que creamos anteriormente.

    Con estas expectativas establecidas, cuando se ejecute tu prueba unitaria y se llame al método isDailyBilling() (presumiblemente definido en otro lugar de tu clase de prueba), el código llamará al método getBiller() en el objeto Billing simulado, que devolverá el objeto Biller simulado que creamos anteriormente. El método getMerchant() del objeto Biller simulado devolverá el objeto Merchant simulado, y el método getDetail() del objeto Merchant simulado devolverá el objeto MerchantDetail simulado con el atributo rule_type establecido en Billing::PERIODIC_MODE_DAILY.

Comments are closed.