我是编程的新手(所以不要太苛刻),我们的讲师从一开始就敦促我们使用TDD进行开发。
我正在做一个小程序,选择一个随机名称。我的测试之一尝试测试同一名称没有被两次选择,但是测试并不总是通过。
这是随机选择某人的功能。我之所以选择shift method(),是因为它删除了数组的第一个元素。
public function random($coders) {
$coders = ['Paul', 'John', 'Brad'];
shuffle($coders);
$pickedCoder = array_shift($coders);
return $pickedCoder;
}
这是测试:
public function testCoderNotKilledTwice()
{
$coders = ['Paul', 'John', 'Brad'];
$killer = new Killer();
$deadCoder1 = $killer->random($coders);
$deadCoder2 = $killer->random($coders);
$this->assertNotEquals($deadCoder1, $deadCoder2);
}
我做错了什么?
“我选择了shift方法(),因为它删除了数组。“
...当然,然后每次您的“ random()”函数内部的$coders = ['Paul', 'John', 'Brad'];
都会每次使用原始值重新创建数组。您使用shift()所做的更改不会在调用“ random()”之间保留。即使您删除了它,每次调用$killer->random($coders);
时,它也会传递原始数组。
您需要在类级别将$coders
定义为(私有)属性,因此其值在对random()函数的调用之间保持不变。无需在random()函数中声明$ coders,也无需将副本作为参数传递给该函数。
类似这样的东西:
class Killer {
private $coders = ['Paul', 'John', 'Brad'];
public function random() {
shuffle($this->coders);
$pickedCoder = array_shift($this->coders);
return $pickedCoder;
}
}
然后:
public function testCoderNotKilledTwice()
{
$killer = new Killer();
$deadCoder1 = $killer->random();
$deadCoder2 = $killer->random();
$this->assertNotEquals($deadCoder1, $deadCoder2);
}