首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PHPUnit在Laravel5.3项目中的类方法调用

PHPUnit在Laravel5.3项目中的类方法调用
EN

Stack Overflow用户
提问于 2016-10-26 07:17:04
回答 2查看 998关注 0票数 1

在phpunit文档之后,我提出了以下代码。测试失败,输出显示它不是调用存根方法,而是调用实际方法,访问数据库并从数据库返回数据。我相信我遗漏了一个步骤,在这个步骤中,我“注入”了测试虚拟,以便调用它,而不是实际的类方法。有人能指出我在这里做错了什么吗?

我的测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$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方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function index() {
    // List all category
    return $this->categoryClass->findAll();
}

注意:$this-> being正在CategoriesController的构造函数方法中实例化。$this->分类类=新的CategoryClass;

findAll方法CategoryClass:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function findAll() {
    // List all categories
    $categories = Category::all(); // Eloquent call to database.
    return json_encode($categories);   
}

谢谢十亿!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-26 08:16:10

当您在模拟类对象中模拟一个方法时,您必须使用这个模拟类对象来获得您的模拟方法的响应。

因此,如果您想要让CategoriesController >index()方法调用模拟的类别类,而不是真正的类别类,则必须将类别类注入到CategoriesController类中。像这样的事情应该有效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$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

票数 1
EN

Stack Overflow用户

发布于 2016-10-26 07:41:25

将模拟的实例绑定到类名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$this->app->instance(CategoryClass::class, $catClassMock);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40266072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文