как правильно проводить модульное тестирование бизнес-логики с помощью RedBeanPHP ORM

Я пытаюсь проверить свою бизнес-логику, которая взаимодействует с RedBeanPHP ORM, я не хочу тестировать сам RedBeanPHP, а поведение моего кода, когда он связан с RedBean.

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

Примечание: вызов этого метода Facade::count('table_name') должен возвращать количество строк в этой таблице, то есть Int.

Я попробовал этот тест, и он не возвращает Int, как я ожидал:

/**
 * @param string $tableName
 * @param int $returnValue
 *
 * @return \PHPUnit_Framework_MockObject_Builder_InvocationMocker
 */
protected function mockCount($tableName, $returnValue)
{
    $this->beanCount = $this->getMockBuilder(Facade::class)->setMethods(['count'])->getMock();
    return $this->beanCount
        ->expects($this->once())
        ->method('count')
        ->with($this->equalTo($tableName))
        ->willReturn($returnValue);
}

public function testCountSuccess()
{
    $tableCount = $this->mockCount('questions', 7);
    $this->assertInternalType('int', $tableCount);
}

Есть ли способ издеваться над статическими методами RedBean? и если есть другой способ или метод, который может работать в этом случае? пожалуйста, порекомендуйте .

Спасибо.


person Asem Khatib    schedule 14.10.2016    source источник


Ответы (1)


Я предлагаю вам использовать библиотеку фиктивного тестирования Phake, которая поддерживает Имитация статических методов. В качестве примера:

/**
 * @param string $tableName
 * @param int $returnValue
 *
 * @return \PHPUnit_Framework_MockObject_Builder_InvocationMocker|Facade
 */
protected function mockCount($tableName, $returnValue)
{
    $this->beanCount = \Phake::mock(Facade::class);

    \Phake::whenStatic($this->beanCount)
        ->count($tableName)
        ->thenReturn($returnValue);

    return $this->beanCount;
}

public function testCountSuccess()
{
    $tableCount = $this->mockCount('questions', 7);
    $this->assertEquals(7, $tableCount::count('questions'));
}

Надеюсь, это поможет

person Matteo    schedule 14.10.2016