【发布时间】:2017-01-05 07:41:34
【问题描述】:
以下是我正在处理的控制器的简化类:
class UserController extends Controller {
protected $user;
public function __construct(User $user) {
$this->user = user;
}
public function contact(ContactFormRequest $request) {
$user = $this->user
->where('email', $request->email)
->with(['orders' => function($q) {
$q->orderBy('created_at', 'desc')
->first();
}])
->first();
return view('contact', ['user' => $user]);
}
}
这是我迄今为止的测试用例:
class ExampleTest extends TestCase {
public function setUp () {
$this->mockUser = Mockery::mock(Model::class, User::class);
$this->app->instance('User', $this->mockUser);
}
public function testContactForm() {
$this->userMock
->shouldReceive('where')
->once()
->with('email', 'fake@email.com')
->andReturn(new Collection(new User, new User));
$this->visit('contact-form');
}
}
我承认我是凭记忆写的,而不是把现有的代码摆在我面前。但是这个工作测试通过了 PHPUnit。问题是访问引发错误,我需要进行额外的->see('something') 测试。
我需要为控制器和视图提供完整且可用的用户模拟的其余模拟。
我希望它看起来像(这是代码出错的地方)
$this->userMock
->shouldReceive('where')
->once()
->with('email', 'fake@email.com')
->andReturn(new Collection(new User))
->shouldReceive('with')
->once();
->with(['orders' => function($q) {
$q->orderBy('created_at', 'desc')
->first();
}])
->andReturn( **something** )
->shouldReceive('first')
->once()
->andReturn(new Collection(new User));
【问题讨论】: