Я игнорирую синтаксическую проблему с определением $this->myclassObject
на уровне класса, потому что я полагаю, что это опечатка, которую вы создали при создании этого вопроса.
Я думаю , что у вас есть двапроблемы:
- Вы переопределяете способность PHPUnit имитировать абстрактные / интерфейсные методы класса / интерфейса, указав
null
в setMethods в LoggerInterface, который говорит, что он ничего не должен высмеивать - YouВы оба отключаете конструктор Foo и , предоставляя аргументы конструктора (в кавычках как скалярное значение имени переменной)
Вы также ссылаетесь на $logger
, который не существует.
Я бы также предположил, что в вашем примере вам вообще не нужно частично издеваться над Foo, так как на данный момент вы не высмеиваете ни одну из его функциональных возможностей.Вы можете просто позвонить new Foo($this->logger)
.Тем не менее, я предполагаю, что ваш пример урезан, и вам do необходимо частично издеваться над другими частями класса, поэтому пока оставим это.
Попробуйте это:
class FooTest extends TestCase
{
private $logger;
private $myclassObject;
protected function setUp()
{
$this->logger = $this->createMock('\Psr\Log\LoggerInterface');
$this->logger->expects($this->any())
->method('debug')
->willReturn('Message Logged');
$this->myclassObject = $this->getMockBuilder('\MyVendor\MyModule\Model\Foo')
->setConstructorArgs([$this->logger])
->getMock();
}
public function testBar()
{
$this->assertEquals($expected_result, $this->myclassObject->Bar());
}
}