Wiem, że nie akceptujesz odpowiedzi na mecze, ale nie mogłem tego rozgryźć. Problemem, który próbowałem rozwiązać, było kpiny z niektórych metod w modelu, aby uniknąć tworzenia ukrytych urządzeń.
Więc skończyło się używając Proxy
wdrożenie wzoru w kpina
private $_product;
public function testMe()
{
// Here we use fixtured instance of Product model to build a Proxy
$this->_product = \Mockery::mock($this->product('product1'));
// somehow model attributes are inaccessible via proxy, but we can set them directly as a Proxy property
$this->_product->id = 1;
$this->_product->shouldReceive('getPrice')->andReturn(1000);
// assertions below
...
}
W tym przykładzie getPrice()
metody z Product
modelu zwraca Product
cena od powiązanych tabelach. I wyśmiewamy to tutaj, abyśmy nie musieli wypełniać db wszystkimi powiązanymi modelami urządzeń. Mimo to, sam Product
wciąż jest urządzeniem stałym.
Może nie najlepsze rozwiązanie, ale udało mi się zaoszczędzić trochę czasu procesora przy jednoczesnym zachowaniu rozdzielonych testów jednostkowych.
Docs tutaj http://docs.mockery.io/en/latest/reference/partial_mocks.html
aktualizacji:
Ja również małą pomocnika do rozwiązania atrybut buforowania problemu
/**
* @param \yii\base\Model $model
* @return \Mockery\MockInterface
*/
private function setupMock($model)
{
$mock = \Mockery::mock($model);
foreach ($model->getAttributes() as $key => $value) {
$mock->$key = $value;
}
return $mock;
}
ten sposób wszystkie atrybuty i odpowiadające im wartości z oryginalnego modelu stać dostępne w wersji próbnej.
Dzięki, wypróbuję! –