我有一个非常直接的用户工厂,除了它取决于外部API调用。由于外部调用已使用特定用户详细信息进行身份验证,因此我不确定是否必须模拟响应或请求?
我的问题是,对于用户测试此工厂的好方法是否有任何建议?
谢谢!
public static function getUser($id)
{
if (!IntegerValidator::valid($id)) {
throw new ValidationException('Invalid id provided');
}
$path = "/users/{$id}";
$cache = MemcachedManager::get($path);
if ($cache) {
return $cache;
}
$client = ClientFactory::getClient();
$result = $client->get($path);
$user = static::createUserFromResult($result);
MemcachedManager::set($path, $result);
return $user;
}
答案 0 :(得分:1)
要使这个可测试,您需要重构代码。您可以非常轻松地在PHPUnit中模拟依赖项,并为其公共API方法调用创建模拟响应。对于您想要实现的目标,您需要将public static void main(String[] args) {
Integer[] repetition = new Integer[] { 4, 6, 4, 4, 6, 5, 7, 4, 3, 3 };
int maxValue = Collections.max(Arrays.asList(repetition));
System.out.println("Maximum: " + maxValue);
for (int i = maxValue; i > 0; i--) {
for (int j = 0; j < repetition.length; j++) {
if (repetition[j] >= i) {
System.out.print(" * ");
} else {
System.out.print(" ");
}
}
System.out.println();
}
for (int j = 0; j < repetition.length; j++) {
System.out.print(" " + (j + 1) + " ");
}
}
注入到方法中,然后您可以在其中使用模拟对象进行单元测试。
答案 1 :(得分:1)
你需要DI来实现这一点。
class Something
{
private $client;
public function __construct(Client $client)
{
$this->client = $client;
}
public function getUser($id)
{
//...
$result = $this->client->get($path);
}
}
class MyTest extends \PHPUnit_Framework_TestCase
{
public function testSomething()
{
$someResult = ''; // Here goes your result
$clientMock = $this->getMockBuilder(Client::class)->disableOriginalConstruction->getMock();
$clientMock->method('get')->willReturn($someResult);
$something = new Something($clientMock);
$something->getUser(1);
}
}
尽可能避免使用静态方法。注入依赖项通常比使用静态方法更好,因为你无法模拟它们。