В чем разница между перегрузкой и псевдонимом в Mockery?
Я новичок в использовании насмешек и запутался с терминологией alias
а также overload
, Может кто-нибудь, пожалуйста, объясните мне, когда использовать какой?
3 ответа
Overload
используется для создания "экземпляра макета". Это будет "перехватывать", когда создается новый экземпляр класса и вместо него будет использоваться макет. Например, если этот код должен быть проверен:
class ClassToTest {
public function methodToTest()
{
$myClass = new MyClass();
$result = $myClass->someMethod();
return $result;
}
}
Вы должны создать экземпляр макета, используя overload
и определите ожидания следующим образом:
public function testMethodToTest()
{
$mock = Mockery::mock('overload:MyClass');
$mock->shouldreceive('someMethod')->andReturn('someResult');
$classToTest = new ClassToTest();
$result = $classToTest->methodToTest();
$this->assertEquals('someResult', $result);
}
Alias
используется, чтобы издеваться над публичными статическими методами. Например, если этот код должен быть проверен:
class ClassToTest {
public function methodToTest()
{
return MyClass::someStaticMethod();
}
}
Вы бы создали псевдоним с помощью alias
и определите ожидания следующим образом:
public function testNewMethodToTest()
{
$mock = Mockery::mock('alias:MyClass');
$mock->shouldreceive('someStaticMethod')->andReturn('someResult');
$classToTest = new ClassToTest();
$result = $classToTest->methodToTest();
$this->assertEquals('someResult', $result);
}
Дополнительная информация к ответу Фредрика Шолда : насмешка над псевдонимом сохраняется для тестовых случаев, поэтому вам нужно деактивировать ее каждый раз, когда вы ее используете. Просто добавьте этот phpDoc в каждый тестовый класс, где вы используете псевдоним:
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
*/
Я нашел это: https://github.com/padraic/mockery-docs/blob/master/reference/startup_methods.rst
$mock = \Mockery::mock('alias:MyNamespace\MyClass');
Префикс действительного имени класса (который в настоящее время НЕ загружен) с "alias:" сгенерирует "псевдоним". Псевдонимы-псевдонимы создают псевдоним класса с заданным именем класса для stdClass и обычно используются для включения имитации открытых статических методов. Ожидания, установленные для нового фиктивного объекта, который ссылается на статические методы, будут использоваться всеми статическими вызовами этого класса.
$mock = \Mockery::mock('overload:MyNamespace\MyClass');
Префикс действительного имени класса (который в данный момент НЕ загружен) с помощью "overload:" сгенерирует псевдоним псевдонима (как с "alias:"), за исключением того, что созданные новые экземпляры этого класса будут импортировать любые ожидания, установленные для источника mock ($ насмешка). Макет источника никогда не проверяется, поскольку он использует хранилище ожиданий для новых экземпляров. Для этой цели мы используем термин "экземпляр макета", чтобы отличить его от более простого "псевдоним макета".
Поэтому мне кажется, что перегрузка делает то же самое, что и псевдоним, с той разницей, что она также импортирует ожидания из макета источника.