2016-11-24 2 views
2

У меня есть этот метод в BrandBehavior, и я хочу его протестировать.Как проверить это поведение с помощью PHPUnit в CakePHP 3.0?

public function setCurrentBrandId(Entity $entity) 
{ 
    if (!isset($entity->brand_id) or empty($entity->brand_id)) { 
     $entity->brand_id = $this->session->read("Brand.id"); 
    } 
} 

Я хочу проверить, действительно ли этот метод устанавливает BrandID. Не могли бы вы привести мне пример, как я должен проверить это? До сих пор я почти ничего не покрывал.

public function setUp() 
{ 
    parent::setUp(); 
    $this->Progress = new BrandsBehavior(); 
} 
public function testSetCurrentBrandId() 
{ 

} 

Если вам нужно что-нибудь еще, дайте мне знать и просто чтобы вы знали, что я начинаю с испытаниями и тестированием.

ответ

3

Во-первых, поведение обычно не имеет доступа к сеансу ($this->session). Я предполагаю, что вы его где-то впрыскиваете. В этом случае вы можете высмеять объект сеанса и протестировать его (вы можете прочитать о насмешливости here).

Во-вторых, метод подписи для \Cake\ORM\Behavior::__construct: Table $table, array $config = [] - это означает, что вам нужно немного изменить метод setUp. This должен дать представление.

В-третьих, тестирование заключается в проверке того, что функция/метод выполняет то, что вы ожидаете от нее (на основе ввода). Таким образом, для реальных тестов вы можете дать ему две сущности (тот, который имеет brand_id поле и другое, что не делает) и assertEquals новое значение в brand_id поле после вызова этого метода

Кроме того, несколько советов:

  • !$entity->has('field_name') ярлык для !isset($entity->brand_id) or empty($entity->brand_id)
  • Инъекционное ваш объект сеанса в поведение не является хорошей идеей. Хотя это имеет очевидное применение, я предлагаю вам либо ввести фактическое значение в поведение, либо (если вам нужна функция для чтения из сеанса), переместите это в компонент.
  • Вместо жесткого кодирования "Brand.id" в качестве ключа сеанса для чтения, рассмотрите его как ключевой конфигурации
+0

Спасибо за ответ Xymanek. Тогда у меня есть еще несколько вопросов. Я фактически вставляю сеанс $ this-> в метод initialize, и я пытаюсь издеваться над ним в методе тестирования. Я не получаю эти строки внутри метода теста - // Создаем заглушку для класса SomeClass. $ stub = $ this-> createMock (SomeClass :: class); Я получаю то, что является SomeClass, и что это должен быть сеанс, но я не понимаю, что такое класс? Спасибо за советы. Я использую все три из них. –

+0

SomeClass :: class возвращает имя класса (с пространством имен) в виде строки – Xymanek

+0

Первый метод в моем классе тестирования выглядит следующим образом. public function testSetCurrentBrandId() { $ stub = $ this-> createMock (Session :: class); $ stub-> method ('setCurrentBrandId') -> willReturn (1); $ this-> assertEquals (1, $ stub-> setCurrentBrandId()); И это то, что он возвращает: Попытка настроить метод «setCurrentBrandId», который не может быть сконфигурирован, поскольку он не существует, не был указан, является окончательным или является статическим Означает ли это, что у меня нет доступа к классу, который я пытаюсь проверить? –

Смежные вопросы