首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHPUnit中使用模拟对象测试实际的类方法

在PHPUnit中使用模拟对象测试实际的类方法
EN

Stack Overflow用户
提问于 2016-09-27 13:36:29
回答 1查看 1.4K关注 0票数 0

我想要做的是:创建一个Mock对象,它不执行__constructor(),但是在编码时拥有所有的方法(而不是模拟返回null)。

医生们说:

默认情况下,原始类的所有方法都被一个只返回null (而不调用原始方法)的虚拟实现替换。例如,使用will($this->returnValue())方法,您可以配置这些虚拟实现来在调用时返回一个值。

这不是我想要的。我不想强迫一个方法返回一个已知的值。我希望测试方法本身,因此需要类的有效实例化,但需要禁用构造函数。

我该怎么做?

EN

回答 1

Stack Overflow用户

发布于 2016-09-27 17:19:10

我为类本身编写了测试用例,以便在不使用Mocks的情况下返回所需的参数。模拟用于对该类的外部引用,这些引用需要知道函数Bar()返回Foo,因此等待响应的类正确地处理结果。

考虑到这个非常简单的PHP类:

代码语言:javascript
复制
<?php
class CATEGORY_SCOPE
{
    public $CategoryName;
    public $CategoryNo;

    function __construct($CategoryNo = NULL, $CategoryName = NULL)
    {
        $this->CategoryName = $CategoryName;
        $this->CategoryNo   = $CategoryNo;
    }

    protected function SetCategoryName($Name)
    {
        $this->CategoryName = Name;
    }
}
?>

然后我会测试它:

代码语言:javascript
复制
<?php
require_once(substr(__FILE__, 0, -5));  // strip '.test' extension
class TEST_CATEGORY_SCOPE extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testObjectCreation()
    {
        $CategoryInfo = new CATEGORY_SCOPE();
        $this->assertInstanceOf('CATEGORY_SCOPE', $CategoryInfo);
    }

    public function testConstructFieldOrder()
    {
        $CategoryInfo = new CATEGORY_SCOPE(1500, 'Category Name');
        $this->assertEquals(1500, $CategoryInfo->CategoryNo);
        $this->assertEquals('Category Name', $CategoryInfo->CategoryName);
    }

    public function testConstructDefaults()
    {
        $CategoryInfo = new CATEGORY_SCOPE();
        $this->assertNull($CategoryInfo->CategoryNo);
        $this->assertNull($CategoryInfo->CategoryName);
    }

    public function testSetCategoryName()
    {
        $CategoryInfo = new CATEGORY_SCOPE();
        $CategoryInfo->SetCategoryName('New Name');
        $this->assertEquals('New Name', $CategoryInfo->CategoryName);
    }
}
?>

这将测试类本身是否工作,并且我可以设置某些值。显然,这是一个简单的例子。现在,当某些东西使用这个类时,我仍然可以在目录中测试字段设置,但这将在这里讨论。

对于您的问题,让我们假设我的类FOO()在构造函数中接受CATEGORY_SCOPE作为参数。您将模拟CATEGORY_SCOPE类,并设置内部Bar()函数以返回一些数据,而不管CATEGORY_SCOPE类所做的处理如何。

代码语言:javascript
复制
<?php
class FOO
{
    public $ReturnValue
    function __construct($CategoryScope)
    {
        $this->ReturnValue = $CategoryScope->Bar();
    }
}
?>

通过模拟CATEGORY_SCOPE类,这样Bar()函数总是返回5(一些对代码有意义的值),您就可以测试FOO类是否按预期工作。

代码语言:javascript
复制
<?php
require_once(substr(__FILE__, 0, -5));  // strip '.test' extension
class TEST_FOO extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testObjectCreation()
    {
        $FooInfo = new FOO();
        $this->assertInstanceOf('FOO', $FooInfo);
    }

    public function testFoo()
    {
        // Set Up the Mock so Bar() returns 5 using your mock library

        ... <- Actual code for the mock goes here

        $FooInfo = new FOO($CategoryMock);
        $this->assertEquals(5, $FooInfo->Bar());
    }
}
?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39726148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档