这个类非常简单,如果有空间,它会在字符串中添加一个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');
}
}
答案 0 :(得分:26)
第0步
删除你的课程并首先编写规范。
在执行此操作时,您经常会发现自己编写了一个不同的(更简单的)实现,当使用规范驱动它时。它不会花费太多时间,但是您的课程将受益于更好的设计和可测试性。
当我不知道代码应该是什么时,我经常使用这种做法。我先把它原型化。一旦设计开始澄清,我删除代码并通过引用它重新开始。
您不必将其删除,进行备份;)
第1步
定义您的初始测试列表。这将是您认为需要涵盖的行为列表。它不是必须完整的,并且它会随着你的进展而发展。
你可以从:
开始第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,直到您完成。只需提取您想要涵盖的下一个行为。它不一定是你列表中的下一个。无论你觉得什么,最好随后实施。
在整个过程中,您经常会发现您之前未曾想过的新行为或边缘情况。只需将它们添加到您的测试列表中,这样就不会分散您的注意力。