首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试早期返回(防御性编程)

测试早期返回(防御性编程)
EN

Stack Overflow用户
提问于 2016-07-29 10:29:05
回答 2查看 207关注 0票数 0

我正在学习测试,并尝试使用“早期返回”来测试一个函数。成功上的函数在另一个类中设置一个属性,而在失败时只返回,所以在这两种情况下它都‘返回’无效。

代码语言:javascript
复制
class Test
{
    private $fileHandler;
    private $config;

    public __constructor($fileHandler, $config)
    {
        $this->fileHandler = $fileHandler;
        $this->config = $config;
    }

    public function example($filePath)
    {
        $exists = $this->fileHandler->exists($filePath);

        if ($exists === false) {
             return;
        }

        $this->config->set($filePath);
    }
}

在这个例子中,我相信我可以通过两个单元测试和模拟fileHandler类来测试这一点。

对于失败(早期返回),不应该调用$config类的方法set(),而如果成功,则应该调用该方法。

但是,如果我尝试将never()更改为once(),就会使我认为整个测试是假的。

代码语言:javascript
复制
/** test */
public function config_is_not_set_with_missing_file()
{
    $fileHandlerMock = $this->getMockBuilder(fileHandler::class)->getMock;
    $fileHandlerMock->method('exists')
        ->willReturn('false');
    $configMock = $this->getMockBuilder(config::class)->getMock;

    $test = new Test($fileHandlerMock, $configMock);
    $test->example('fake file path');

    $configMock->expects($this->never())
        ->method('set');
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-29 19:20:45

您的文件处理程序模拟正在返回字符串'false',即!==false。将其更改为falseTets::example应该会提前返回。

票数 1
EN

Stack Overflow用户

发布于 2016-07-29 11:19:04

您没有将$configMock传递给Test构造函数,因此没有使用它。

您是对的,如果测试通过时都符合oncenever的期望,那么测试就不能像预期的那样工作,需要检查它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38656535

复制
相关文章

相似问题

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