在phpunit文档之后,我提出了以下代码。测试失败,输出显示它不是调用存根方法,而是调用实际方法,访问数据库并从数据库返回数据。我相信我遗漏了一个步骤,在这个步骤中,我“注入”了测试虚拟,以便调用它,而不是实际的类方法。有人能指出我在这里做错了什么吗?
我的测试:
$shouldReturn = '[{"name":"A Category Name 1"},{"name":"A Category Name 2"},{"name":"A Category Name 3"}]';
// Create a mock for the CategoryClass,
$catClassMock = $this->getMockBuilder(CategoryClass::class)->getMock();
// Set up the Test Dummy for the findAll method and stub what should be returned.
$catClassMock->expects($this->once())
->method('findAll')
->with($this->returnValue($shouldReturn));
// Setup the controller object, and call the index method.
$CategoriesController = new CategoriesController();
$returnedResults = $CategoriesController->index();
// Assert the results equal what we told the method to return.
$this->assertEquals($returnedResults, $shouldReturn);
CategoriesController方法:
public function index() {
// List all category
return $this->categoryClass->findAll();
}
注意:$this-> being正在CategoriesController的构造函数方法中实例化。$this->分类类=新的CategoryClass;
findAll方法CategoryClass:
public function findAll() {
// List all categories
$categories = Category::all(); // Eloquent call to database.
return json_encode($categories);
}
谢谢十亿!
发布于 2016-10-26 08:16:10
当您在模拟类对象中模拟一个方法时,您必须使用这个模拟类对象来获得您的模拟方法的响应。
因此,如果您想要让CategoriesController >index()方法调用模拟的类别类,而不是真正的类别类,则必须将类别类注入到CategoriesController类中。像这样的事情应该有效:
$shouldReturn = '[{"name":"A Category Name 1"},{"name":"A Category Name 2"},{"name":"A Category Name 3"}]';
$catClassMock = $this->getMockBuilder(CategoryClass::class)
->setMethods(['findAll'])
->getMock();
// Set up the Test Dummy for the findAll method and stub what should be returned.
$catClassMock
->method('findAll')
->willReturn($shouldReturn);
// Setup the controller object, and call the index method.
$CategoriesController = new CategoriesController();
$CategoriesController->categoryClass = $catClassMock;
$returnedResults = $CategoriesController->index();
// Assert the results equal what we told the method to return.
$this->assertEquals($returnedResults, $shouldReturn);
我还应该提到,在每次测试之前创建内存中的sqlite数据库也是可行的,并消除了嘲弄您雄辩的查询的需要。从长远来看,这也可能更容易维护。关于如何为Laravel的雄辩力建立一个测试数据库的所有细节,请查看https://laracasts.com/series/phpunit-testing-in-laravel。
发布于 2016-10-26 07:41:25
将模拟的实例绑定到类名:
$this->app->instance(CategoryClass::class, $catClassMock);
https://stackoverflow.com/questions/40266072
复制相似问题