Tôi biết bạn không chấp nhận câu trả lời lịch thi đấu, nhưng tôi cũng không thể tìm ra câu trả lời. Vấn đề tôi đã cố gắng giải quyết thực sự là chế nhạo một số phương thức trong mô hình để tránh tạo ra các đồ đạc cơ bản.
Vì vậy, tôi đã kết thúc bằng Proxy
mẫu thực hiện trong mockery
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
...
}
Trong ví dụ phương pháp getPrice()
này từ Product
mô hình trả Product
giá từ các bảng liên quan. Và chúng tôi giả lập nó ở đây để chúng tôi sẽ không phải điền db với tất cả các đồ đạc mô hình liên quan. Tuy nhiên Product
chính nó vẫn là một vật cố định.
Có lẽ không phải là giải pháp tốt nhất, nhưng quản lý để tiết kiệm cho tôi một số thời gian CPU trong khi vẫn giữ các bài kiểm tra đơn vị được tách riêng.
Documents đây http://docs.mockery.io/en/latest/reference/partial_mocks.html
cập nhật:
Tôi cũng làm một helper nhỏ để giải quyết thuộc tính proxy vấn đề
/**
* @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;
}
Bằng cách này tất cả các thuộc tính và giá trị tương ứng của họ từ mô hình ban đầu trở thành có sẵn trong mô hình.
Cảm ơn, tôi sẽ dùng thử! –