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.
davy.ai
Para crear correctamente valores de retorno de una función anidada utilizando Stub, puedes utilizar el método
expects()
en lugar demake()
. El métodoexpects()
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étodogetBiller()
y devolver un objetoBiller
con un objetoMerchant
simulado con un objetoMerchantDetail
simulado, así:Aquí, primero creamos un objeto
Billing
simulado. Luego, creamos un objetoMerchantDetail
simulado, un objetoMerchant
simulado con el métodogetDetail()
simulado para devolver el objetoMerchantDetail
, y un objetoBiller
simulado con el métodogetMerchant()
simulado para devolver el objetoMerchant
.Finalmente, establecemos una expectativa en una llamada al método
getBiller()
del objetoBilling
. Utilizamos el métodoonce()
para especificar que esperamos que este método sea llamado una vez. Luego, utilizamos el métodowillReturn()
para especificar que el método debe devolver el objetoBiller
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étodogetBiller()
en el objetoBilling
simulado, que devolverá el objetoBiller
simulado que creamos anteriormente. El métodogetMerchant()
del objetoBiller
simulado devolverá el objetoMerchant
simulado, y el métodogetDetail()
del objetoMerchant
simulado devolverá el objetoMerchantDetail
simulado con el atributorule_type
establecido enBilling::PERIODIC_MODE_DAILY
.