Open dashiwa opened 5 years ago
По умолчанию все методы исходного класса заменяются фиктивной (dummy) реализацией, которая просто возвращает null (без вызова исходного метода).
will($this->returnValue()) Например, используя метод will($this->returnValue()), вы можете настроить эти фиктивные реализации для возврата значения при вызове.
Mock
<?php
class SomeClass
{
public function doSomething()
{
// Сделать что-нибудь.
}
}
<?php
use PHPUnit\Framework\TestCase;
class StubTest extends TestCase
{
public function testStub()
{
// Создать заглушку для класса SomeClass.
$stub = $this->createMock(SomeClass::class);
// Настроить заглушку.
$stub->method('doSomething')
->willReturn('foo');
// Вызов $stub->doSomething() теперь вернёт 'foo'.
$this->assertSame('foo', $stub->doSomething());
}
}
Используя API Mock Builder можно настроить генерируемый класс тестового двойника
<?php
use PHPUnit\Framework\TestCase;
class StubTest extends TestCase
{
public function testStub()
{
// Создать заглушку для класса SomeClass.
$stub = $this->getMockBuilder(SomeClass::class)
->disableOriginalConstructor()
->disableOriginalClone()
->disableArgumentCloning()
->disallowMockingUnknownTypes()
->getMock();
// Настроить заглушку.
$stub->method('doSomething')
->willReturn('foo');
// Вызов $stub->doSomething() теперь вернёт 'foo'.
$this->assertSame('foo', $stub->doSomething());
}
}
В приведённых примерах мы до сих пор возвращали простые значения, используя
willReturn($value).
Это короткий синтаксис делает то же, что и will($this->returnValue($value)).
Мы можем использовать вариации этого более длинного синтаксиса для достижения более сложного поведения заглушки.
Иногда вы хотите вернуть один из аргументов вызванного метода (без изменений) в качестве результата вызова подмены метода. Пример 9.4 показывает, как вы можете сделать этого, используя returnArgument() вместо returnValue().
<?php
use PHPUnit\Framework\TestCase;
class StubTest extends TestCase
{
public function testReturnArgumentStub()
{
// Создать заглушку для класса SomeClass.
$stub = $this->createMock(SomeClass::class);
// Настроить заглушку.
$stub->method('doSomething')
->will($this->returnArgument(0));
// $stub->doSomething('foo') вернёт 'foo'
$this->assertSame('foo', $stub->doSomething('foo'));
// $stub->doSomething('bar') вернёт 'bar'
$this->assertSame('bar', $stub->doSomething('bar'));
}
}
createMock($type)
createMock($type) Метод createMock($type) немедленно возвращает объект тестового двойника для указанного типа (интерфейса или класса). Создание этого тестового двойника осуществляется с использованием настроек по умолчанию. Методы construct() и clone() не выполняются, а аргументы, переданные методу тестового двойника, не будут клонироваться. Если эти значения по умолчанию не нужны, вы можете использовать метод getMockBuilder($type) для настройки генерации тестового двойника, используя текучий (fluent) интерфейс.