2017-01-27 38 views
1

Я изучаю код, и мне интересно, в чем разница между заглушками и светильниками. Оба помогают мне загрузить четко определенные данные и kepp tessts просто.Difference Stub Fixture

Но когда я использую \ Codeception \ Util \ Окурка и когда я могу использовать \ Codeception \ UTIL \ Светильники

ответ

1

Так заглушкой что Codeception использует для фиктивных объектов. Короче говоря, насмешка - это создание объектов, которые имитируют поведение реальных объектов.

Вот пример:

class UpdateBalance 
{ 
    public $balanceRepository; 

    public function __construct(BalanceRepositoryInterface $balanceRepository) 
    { 
     $this->balanceRepository = $balanceRepository; 
    } 

    public function subtract($amount, $id) 
    { 
     $updatedAmount = $this->balanceRepository->subtract($amount, $id); 

     if ($updatedAmount < 0) { 
      throw NegativeBalanceException($updatedAmount, $id); 
     } 

     return $updatedAmount; 

    } 
} 


class UpateBalanceTest extends PHPUnit_Framework_TestCase 
{ 
    public function testSubtractThrowsNegativeBalanceException() 
    { 

     $balanceRepository = Stub::make(
      'BalanceRepositoryInterface' 
      array(
       'subtract' => Stub::atLeastOnce(function() { return -100 }) 
      ) 
     ); 


     $updateBalance = new UpdateBalance($balanceRepository); 

     $this->expectException(NegativeBalanceException::class); 

     $updateBalance->subtract(100, 1); 


    } 
} 

Обратите внимание, что мы не имеем класс BalanceRepsository. Мы использовали заглушки Codeception и делали вид, что класс BalanceRepository существует. Притворив, что он существует, мы можем протестировать функциональность функции UpdateBalance :: subtract, проверив, что выбрано исключение NegativeBalanceException.

Светильники, с другой стороны, предназначены для обмена тестовыми данными на всех ваших тестах. Если мы используем UpdateBalance :: вычитать пример() еще раз, мы могли бы подчеркнуть, проверить поле суммы обеспечения он выдает правильное исключение в зависимости от количества пропускает через:

// In some bootstrap or setup function 
Fixtures::add('zero-amount', 0); 
Fixtures::add('negative-amount', -1); 
Fixtures::add('string-negative-amount', '-1'); 




class UpdateBalance 
{ 
    // ... 

    public function subtract($amount, $id) 
    { 
     if ($amount < 0) { 
      throw new 
     } 

     // ... 

    } 
} 


class UpateBalanceTest extends PHPUnit_Framework_TestCase 
{ 

    // ... 

    public function testSubtractThrowsCantSubtractNegativeAmountException() 
    { 

     $balanceRepository = Stub::make(
      'BalanceRepositoryInterface' 
     ); 


     $updateBalance = new UpdateBalance($balanceRepository); 

     $this->expectException(CantSubtractNegativeAmountException::class); 

     $updateBalance->subtract(Fixture::get('negative-amount'), 1); 


    } 
} 

Теперь мы можем использовать наши предопределенные светильники во всех наших тестах. Я хотел бы отметить, что использование приборов в приведенном выше примере, вероятно, будет чрезмерным, но для более сложных тестовых данных, таких как проверка шестнадцатеричных значений, это будет намного полезнее.

+1

Большое спасибо за ваш ответ. Если я правильно понимаю, вы используете fixtur в кодексе, таком как фиксированная (статическая) переменная. И заглушка для имитации объекта. Я думаю, что это сбивает с толку, потому что вы часто читаете, что заглушки - это светильники. – astridx

+1

Я думаю, что это хорошее резюме да! – thomasstuttard

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

  • Нет связанных вопросов^_^