PHPUnit TDD вопросы

Я изучаю TDD и у меня есть несколько вопросов. — Идея состоит в том, чтобы создать Simple Factory, руководствуясь тестами. Дело в том, что мой тестовый охват не на 100%, и именно в этом мои вопросы.

Прежде чем я покажу вам код, позвольте мне объяснить, что я хочу.

  • Фабрика отвечает за создание экземпляров классов, и чтобы проверить это, мне нужно смоделировать создание экземпляров класса. Для этого я использую конкретный класс, он работает, но когда я вижу покрытие теста, появляется конкретный класс, и это не так. 100% проверено. (Ты поймешь). — Я хочу избежать этого, я хочу проверить фабрику как можно более абстрактно.
  • И другая проблема заключается в том, что я хочу вставить фабрику как зависимость от конструктора, как это проверить?

Покрытие:

  • PizzaStore.php — 33,33% — Конструктор с заводской зависимостью не тестировался.
  • PizzaFactory.php — 100%
  • Pizza.php — 100%
  • Pizza / Greek.php — 0,00% — появился после тестирования фабрики с использованием класса бетона.

Yoda

PizzaTest.php:

<?php namespace Pattern\SimpleFactory;

use PHPUnit_Framework_TestCase;

class PizzaTest extends PHPUnit_Framework_TestCase {

private $pizza;

public function setUp()
{
$this->pizza = $this->getMockForAbstractClass('Pattern\SimpleFactory\Pizza');
}

/**
* @covers Pattern\SimpleFactory\Pizza::setName
* @covers Pattern\SimpleFactory\Pizza::getName
*/
public function testPizzaSetsAndReturnsTheExpectedName()
{
$pizzaName = 'Greek Pizza';
$this->pizza->setName($pizzaName);
$this->assertEquals($pizzaName, $this->pizza->getName());
}

/**
* @covers Pattern\SimpleFactory\Pizza::setDescription
* @covers Pattern\SimpleFactory\Pizza::getDescription
*/
public function testPizzaSetsAndReturnsTheExpectedDescription()
{
$pizzaDescription = 'A Pepperoni-style pizza with dough, tomato, and cheese';
$this->pizza->setDescription($pizzaDescription);
$this->assertEquals($pizzaDescription, $this->pizza->getDescription());
}

}

PizzaStoreTest.php:

<?php namespace Pattern\SimpleFactory;

use PHPUnit_Framework_TestCase;

class PizzaStoreTest extends PHPUnit_Framework_TestCase {

/**
* @covers Pattern\SimpleFactory\PizzaStore::order
*/
public function testStoreShouldReturnsTheRequestedPizzaWhenOrdered()
{
$factory = new PizzaFactory();
$store = new PizzaStore($factory);
$pizza = $store->order('greek');
$this->assertInstanceOf('Pattern\SimpleFactory\Pizza', $pizza);
}

}

PizzaFactoryTest.php:

<?php namespace Pattern\SimpleFactory;

use PHPUnit_Framework_TestCase;

class PizzaFactoryTest extends PHPUnit_Framework_TestCase {

/**
* @var PizzaFactory
*/
private $pizzaFactory;

public function setUp()
{
$this->pizzaFactory = new PizzaFactory();
}

/**
* @covers Pattern\SimpleFactory\PizzaFactory::make
*/
public function testPizzaFactoryMakesAPizza()
{
$pizza = $this->pizzaFactory->make('greek');
$this->assertInstanceOf('Pattern\SimpleFactory\Pizza', $pizza);
}

/**
* @covers Pattern\SimpleFactory\PizzaFactory::make
*/
public function testPizzaFactoryReturnsNullWhenMakingANonexistentPizza()
{
$pizza = $this->pizzaFactory->make(null);
$this->isNull($pizza);
}

}

PizzaStore.php:

<?php namespace Pattern\SimpleFactory;

/**
* @package Pattern\SimpleFactory
*/
class PizzaStore {

/**
* @var PizzaFactory
*/
private $factory;

/**
* @param PizzaFactory $factory
*/
function __construct(PizzaFactory $factory)
{
$this->factory = $factory;
}

/**
* @param string $name
* @return null|Pizza
*/
public function order($name)
{
return $this->factory->make($name);
}

}

PizzaFactory.php:

<?php namespace Pattern\SimpleFactory;

/**
* @package Pattern\SimpleFactory
*/
class PizzaFactory {

/**
* @var array
*/
private $pizzas = [
'greek'     => 'Pattern\SimpleFactory\Pizza\Greek',
'pepperoni' => 'Pattern\SimpleFactory\Pizza\Pepperoni',
];

/**
* @param string $name
* @return null|Pizza
*/
public function make($name)
{
if (isset($this->pizzas[$name]))
{
return new $this->pizzas[$name];
}

return null;
}

}

Pizza.php:

<?php namespace Pattern\SimpleFactory;

/**
* @package Pattern\SimpleFactory
*/
abstract class Pizza {

/**
* @var string
*/
private $name;
/**
* @var string
*/
private $description;

/**
* @return string
*/
public function getName()
{
return $this->name;
}

/**
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}

/**
* @return string
*/
public function getDescription()
{
return $this->description;
}

/**
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}

}

Пицца \ Pepperoni.php:

<?php namespace Pattern\SimpleFactory\Pizza;

use Pattern\SimpleFactory\Pizza;

/**
* @package Pattern\SimpleFactory\Pizza
*/
class Pepperoni extends Pizza {

function __construct()
{
parent::setName('Pizza Pepperoni');
parent::setDescription('A Pepperoni-style pizza with dough, tomato, and cheese');
}

}

Пицца \ Greek.php:

<?php namespace Pattern\SimpleFactory\Pizza;

use Pattern\SimpleFactory\Pizza;

/**
* @package Pattern\SimpleFactory\Pizza
*/
class Greek extends Pizza {

function __construct()
{
parent::setName('Pizza Greek');
parent::setDescription('A Greek-style pizza with feta cheese, onion, olive and tomato');
}

}

И это все, что-то не так, пожалуйста, скажите это. Заранее спасибо.

2

Решение

Фабрика отвечает за создание экземпляров классов и тестирование этого
Я должен имитировать создание экземпляров класса, делая это, я
используя конкретный класс, это работает, но когда я вижу тестовое покрытие,
конкретный класс появляется, и это не на 100% проверено. (Ты сможешь
Понимаю). — Я хочу избежать этого, я хочу проверить завод как
абстрактно, насколько это возможно.

Это недостающее покрытие в PizzaStore класс вызывается, потому что вы не тестируете случай, когда фабрика не нашла класс.

Отсутствует контрольный пример:

/**
* @covers Pattern\SimpleFactory\PizzaStore::order
*/
public function testStoreShouldReturnsTheRequestedPizzaWhenOrdered()
{
$factory = new PizzaFactory();
$store = new PizzaStore($factory);
$pizza = $store->order('not exists pizza type');
$this->assertNull($pizza);
}

И другая проблема заключается в том, что я хочу вставить заводскую как
зависимость от конструктора, как это проверить?

Вы могли бы использовать издевались PizzaFactory Класс и проверить затем вызывается. Я не знаю, как это работает с PHPUnit издевается, но в узо-лакомство макет утилиты это выглядит так:

public function testFactory()
{
$factory = Mock::create('\Pattern\SimpleFactory\PizzaFactory');
Mock::when($factory)->make()->thenReturn(new \Pattern\SimpleFactory\Pizza\Greek());

$magic = new Magic($factory);

$order = $magic->order();

Mock::verify($factory)->make();
$this->assertInstanceOf('\Pattern\SimpleFactory\Pizza\Greek', $order);
}

это Mock::verify метод проверяет этот метод PizzaFactory::make назывался.

Кроме того, по моему мнению, в вашем случае лучше использовать интерфейс через наследование.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]