如何测试这个类或重写它是可测试的? phpspec

时间:2015-04-23 15:44:22

标签: php testing phpspec

这个类非常简单,如果有空间,它会在字符串中添加一个twitter主题标签。 Twitter只允许140个字符(网址减去23)。因此,如果有一个空间,则标签会不断添加。

我认为它100%按预期工作,但这与我在下面的问题无关。

class Hashtags {

private $url_character_count = 23;
private $characters_allowed = 140;

public function __construct(Article $article)
{
    $this->article = $article;
    $this->characters_remaining = $this->characters_allowed - $this->url_character_count;
}

public function createHashtagString()
{
        $hashtags = '';
        $hashtags .= $this->addEachNodeHashtag();
        $hashtags .= $this->addHashtagIfSpace($this->article->topic_hashtag);
        $hashtags .= $this->addHashtagIfSpace($this->article->pubissue_hashtag);
        $hashtags .= $this->addHashtagIfSpace($this->article->subject_area_hashtag);
        $hashtags .= $this->addHashtagIfSpace('#aviation');
        return $hashtags;
}

private function addEachNodeHashtag()
{
    //Returns a hashtag or calls hashtagString() if it is a comma separated list
}

private function hashtagString()
{
    //Explodes a comma seperated string of hashtags and calls addHashtagIfSpace()

}

private function addHashtagIfSpace($hashtag_string)
{
    if((strlen($hashtag_string) + 1) <= $this->characters_remaining)
    {
        $this->characters_remaining = $this->characters_remaining - strlen($hashtag_string);

        if(empty($hashtag_string))
        {
            return '';
        }

        return ' ' . $hashtag_string;
    }
}

}

这是我的测试,我的问题是,这只测试一个特定的情况,其中填写了所有字段,并且当有足够的空间来适应它们时。我是否应该为不同的情况继续制作一堆这些测试功能?我估计会有大约10个。我以前从未做过测试,所以我有点偏离我的元素,需要指出正确的方向。

谢谢

class HashtagsSpec extends ObjectBehavior
{

function it_creates_hashtag_string_with_all_fields_filled_in(Article $article)
{
    $this->beConstructedWith($article);
    $article->title = 'This is the article title';
    $article->url = 'http://website.com/node/XXX';
    $article->pubissue_hashtag = '#AHASHTAG';
    $article->subject_area_hashtag = '#SUBAREA';
    $article->topic_hashtag = '#TOPIC';
    $article->node_hashtags = '#Test1,#Test2,#Test3';

    $this->createHashtagString()->shouldReturn(' #Test1 #Test2 #Test3 #TOPIC #AHASHTAG #SUBAREA #aviation');

}
}

1 个答案:

答案 0 :(得分:26)

第0步

删除你的课程并首先编写规范。

在执行此操作时,您经常会发现自己编写了一个不同的(更简单的)实现,当使用规范驱动它时。它不会花费太多时间,但是您的课程将受益于更好的设计和可测试性。

当我不知道代码应该是什么时,我经常使用这种做法。我先把它原型化。一旦设计开始澄清,我删除代码并通过引用它重新开始。

您不必将其删除,进行备份;)

第1步

定义您的初始测试列表。这将是您认为需要涵盖的行为列表。它不是必须完整的,并且它会随着你的进展而发展

你可以从:

开始
  • 如果消息中有空间,则会添加主题#标签
  • 如果在添加主题标签后消息中有空间,则会添加pubissue主题标签
  • 如果在添加主题和pubissue主题标签后消息中有空间,则添加主题区域标签
  • 如果消息
  • 中没有空间,则不会添加主题#标签
  • 如果在添加主题标签后消息中没有空间,则不添加pubissue主题标签
  • 如果在添加主题和pubissue主题标签后消息中没有空间,则不会添加主题区域标签

第2步

写下第一个规格。考虑更好的命名,因为Hashtags可能不够具体。同时考虑为您的班级提供更好的API。我选择在方法调用中接受Article而不是通过构造函数传递它:

class HashtagsSpec
{
    function it_adds_a_topic_hashtag_if_there_is_room_for_it_in_the_message(Article $article)
    {
        $article->pubissue_hashtag = '#AHASHTAG';
        $article->subject_area_hashtag = '#SUBAREA';
        $article->topic_hashtag = '#TOPIC';
        $article->node_hashtags = '#Test1,#Test2,#Test3';

        $this->createHashtagString($article)->shouldMatch('/#TOPIC/');
    }
}

第3步

运行phpspec并编写最简单的代码以使规范通过。

class Hashtags
{
    public function createHashtagString(Article $article)
    {
        return $article->topic_hashtag;
    }
}

第4步

重构 - 改进您在步骤3中编写的代码设计。

可能没有什么可以改进的,特别是在第一次迭代中。

随着您的进展,您的代码将变得更加通用,而您的规范将变得更加具体。

第5步

重复步骤2到5,直到您完成。只需提取您想要涵盖的下一个行为。它不一定是你列表中的下一个。无论你觉得什么,最好随后实施。

在整个过程中,您经常会发现您之前未曾想过的新行为或边缘情况。只需将它们添加到您的测试列表中,这样就不会分散您的注意力。