这个类相当简单,如果有空间的话,它会在字符串中添加一个twitter标签。twitter只允许140个字符(url减去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');
}
}
步骤0
去掉你的课,重新开始,先写说明书。
当你这样做的时候,你经常会发现自己在编写一个不同的(更简单的)实现,当你用规范驱动它的时候。这不会花费太多时间,但您的类将受益于更好的设计和可测试性。
当我不知道代码应该是什么样子时,我经常使用这种做法。我首先制作了它的原型。一旦设计开始澄清,我就删除代码,重新开始拼写。
你不必真正删除它,做一个备份;)
步骤1
定义您的初始测试列表。这将是一份你认为需要涵盖的行为清单。它不一定是完整的,它会随着你的前进而发展。
你可以从开始
- 如果消息中有空间,它会添加一个主题标签
- 在添加主题标签后,如果消息中有空间,它会添加pubissue标签
- 在添加主题和pubissue标签后,如果消息中有空间,它会添加主题区域标签
- 如果消息中没有主题标签的空间,它不会添加主题标签
- 如果添加主题标签后消息中没有空间,则不会添加pubissue标签
- 如果在添加主题和pubissue标签后消息中没有空间,则不会添加主题区域标签
步骤2
编写第一个规范。考虑更好的命名,因为哈希标签可能不够具体。还要考虑为您的类提供更好的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并编写最简单的代码使spec通过。
class Hashtags
{
public function createHashtagString(Article $article)
{
return $article->topic_hashtag;
}
}
步骤4
重构-改进您在步骤3中编写的代码的设计。
可能没有什么需要改进的,尤其是在第一次迭代中。
随着时间的推移,您的代码将变得更加通用,而您的规范将变得更加具体。
步骤5
重复步骤2到5,直到完成为止。只需选择下一个你想要覆盖的行为。它不一定是你名单上的下一个。不管你觉得怎样,下一步最好执行。
在整个过程中,你经常会发现以前从未想过的新行为或边缘案例。只需将它们添加到你的测试列表中,这样就不会分散你的注意力。