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

EvW*_*ill 2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

这是我的测试,我的问题是这只测试一个特定的情况,其中填写所有字段,并且当有足够的空间来适应它们时.我是否应该为不同的情况继续制作一堆这些测试功能?我估计会有大约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');

}
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*las 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/');
    }
}
Run Code Online (Sandbox Code Playgroud)

第3步

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

class Hashtags
{
    public function createHashtagString(Article $article)
    {
        return $article->topic_hashtag;
    }
}
Run Code Online (Sandbox Code Playgroud)

第4步

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

可能没有什么可以改进的,尤其是在第一次迭代中.

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

第5步

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

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