Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit模拟类常数_Php_Oop_Mocking_Phpunit - Fatal编程技术网

PHPUnit模拟类常数

PHPUnit模拟类常数,php,oop,mocking,phpunit,Php,Oop,Mocking,Phpunit,我正在测试一个注入了依赖项的类。在我的无限聪明中,我在代码中分散了对依赖项的类常量的引用 (为这个愚蠢的例子感到抱歉,我想离开foobar。) 您正在使用Author提供的类常量这一事实意味着您依赖于在代码中以及测试中提供该类。因此,为了测试Book\u PhoneBook,您需要一个带有常量的Author类。如果类常量是需要传递给类的一系列标志,则需要使该类可用,并在测试中确保加载了原始类。对于Book\u PhoneBook::getCover(),您依赖于该类 您也可以在Book\u Ph

我正在测试一个注入了依赖项的类。在我的无限聪明中,我在代码中分散了对依赖项的类常量的引用

(为这个愚蠢的例子感到抱歉,我想离开foobar。)


您正在使用Author提供的类常量这一事实意味着您依赖于在代码中以及测试中提供该类。因此,为了测试
Book\u PhoneBook
,您需要一个带有常量的
Author
类。如果类常量是需要传递给类的一系列标志,则需要使该类可用,并在测试中确保加载了原始类。对于
Book\u PhoneBook::getCover()
,您依赖于该类

您也可以在
Book\u PhoneBook
中使用class常量的字符串值,尽管这样做有点违背了将其设置为常量的目的,因此您可以在一个位置更改该值

以您的示例为例,了解您试图实现的目标有点困难,但由于您希望在
Book\u PhoneBook
中删除对
Author
的依赖,因此我将其更改为以下内容:

<?php

class Book_PhoneBook extends Book {

    private $author;

    public function __construct(Author $author) {
        $this->author = $author;
    }

    public function getCover() {
        return $this->author->getTitle() . ' - YELLOW PAGES';
    }
}


class Author {
    const NAME_UNKNOWN = 'anonymous';

    public function __construct($nameStyle) {
       $this->nameStyle = $nameStyle;
    }

    public function getTitle() {
        //do complicated calculation of author name
        if ($this->nameStyle == $this::NAME_UNKNOWN) {
            $name = "Anonymous";
        }

        //do further complicated calculations, modifying $name

        return $name;
    }
}

您正在使用Author提供的类常量这一事实意味着您依赖于在代码中以及测试中提供该类。因此,为了测试
Book\u PhoneBook
,您需要一个带有常量的
Author
类。如果类常量是需要传递给类的一系列标志,则需要使该类可用,并在测试中确保加载了原始类。对于
Book\u PhoneBook::getCover()
,您依赖于该类

您也可以在
Book\u PhoneBook
中使用class常量的字符串值,尽管这样做有点违背了将其设置为常量的目的,因此您可以在一个位置更改该值

以您的示例为例,了解您试图实现的目标有点困难,但由于您希望在
Book\u PhoneBook
中删除对
Author
的依赖,因此我将其更改为以下内容:

<?php

class Book_PhoneBook extends Book {

    private $author;

    public function __construct(Author $author) {
        $this->author = $author;
    }

    public function getCover() {
        return $this->author->getTitle() . ' - YELLOW PAGES';
    }
}


class Author {
    const NAME_UNKNOWN = 'anonymous';

    public function __construct($nameStyle) {
       $this->nameStyle = $nameStyle;
    }

    public function getTitle() {
        //do complicated calculation of author name
        if ($this->nameStyle == $this::NAME_UNKNOWN) {
            $name = "Anonymous";
        }

        //do further complicated calculations, modifying $name

        return $name;
    }
}

对于将来遇到类似问题的任何人,我最终根据@Schleis的回答得出了以下结论:

class Author {
    const NAME_UNKNOWN = 'anonymous';

    private function getTitle($nameStyle) {
        //do stuff, taking $nameStyle into account
        return $name;
    }

    public function getAnonymousTitle() {
        return $this->getTitle($this::NAME_UNKNOWN);
    }
}

对于任何将来遇到类似问题的人,我最终根据@Schleis的回答得出以下结论:

class Author {
    const NAME_UNKNOWN = 'anonymous';

    private function getTitle($nameStyle) {
        //do stuff, taking $nameStyle into account
        return $name;
    }

    public function getAnonymousTitle() {
        return $this->getTitle($this::NAME_UNKNOWN);
    }
}

您可以模拟方法。是否尝试在Book\u PhoneBook类中使用$author::NAME\u UNKNOWN引用常量?毕竟mock扩展了真正的类。@sectus我想预订电话簿::getCover()。如果我没有包含Author类(通常在另一个文件中),这个测试将失败。我不明白你的评论,我该嘲笑什么?@gontrollez你的意思是:
return$this->author->getTitle($this->author::NAME_UNKNOWN)。”黄页",?这将导致
Parse error:syntax error,意外的“::”(T_PAAMAYIM_NEKUDOTAYIM)
您可以模拟方法。是否尝试在Book\u PhoneBook类中使用$author::NAME\u UNKNOWN引用常量?毕竟mock扩展了真正的类。@sectus我想预订电话簿::getCover()。如果我没有包含Author类(通常在另一个文件中),这个测试将失败。我不明白你的评论,我该嘲笑什么?@gontrollez你的意思是:
return$this->author->getTitle($this->author::NAME_UNKNOWN)。”黄页",?这将导致
分析错误:语法错误,意外的“::”(T_PAAMAYIM_NEKUDOTAYIM)