2016-10-14 6 views
1

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

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

Примечание: вызов этого метода 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); 
} 

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

спасибо.

ответ

1

Я предлагаю вам использовать The Phake mock testing library, что поддерживает Mocking Static Methods. Как пример:

/** 
* @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')); 
} 

Надеется, что это помощь

+0

Благодаря @Matteo, он работал как шарм :) –