2010-03-09 3 views
7

모의 객체 내에 클래스 수준 변수를 설정하는 방법이 있습니까?모의 객체 내에서 변수를 설정하는 방법

$stub = $this->getMock('SokmeClass', array('method')); 
$stub->expects($this->once()) 
     ->method('method') 
     ->with($this->equalTo($arg1)); 

승리가 제대로 작동하도록 설정해야하는 변수가 실제 클래스 :

나는이 비슷한 설정 mock 객체가 있습니다. mock 객체 내에서 변수를 어떻게 설정할 수 있습니까?

답변

2

스텁의 개념은 종속성을 동일한 (선택적으로) 구성된 반환 값을 반환하는 동일한 메서드 인터페이스를 제공하는 테스트 이중으로 바꾸는 것입니다. 이 방법으로 SUT는 종속성처럼 이중으로 작업 할 수 있습니다. 당신이 스텁에서 특정 반환 값이 필요한 경우, 당신은 단지

// Create a stub for the SomeClass class. 
$stub = $this->getMock('SomeClass'); 

// Configure the stub. 
$stub->expects($this->any()) 
    ->method('doSomething') 
    ->will($this->returnArgument(0)); 

$stub->doSomething('foo'); // returns foo 

이 작동하는 이유

+0

나는 예제를 이해하기 쉬워야한다고 생각합니다. 클래스는 다음과 유사합니다. class SomeClass { $ someVar; 공용 함수 setSomeVar (Color $ blue) { $ someVar = "Blue"; } 공용 함수 getSomeVar() { return $ someVar; } } 모의 객체에서는 변수를 설정할 수 없으므로 객체의 다른 곳에서 사용할 때 null을 얻습니다. – Enrique

+0

@Enrique 흠, 당신이나 저도 그걸 얻지 못합니다 :) 당신 모의 작품을 만들 때 그것이 무엇을 반환해야하는지 모크에게 알릴 수 있습니다. 내부에 아무 것도 설정할 필요가 없습니다. 파란색으로 되돌리려면 파란색으로 되돌아 가라고 말하십시오. – Gordon

+0

@Gordon OK. 어쩌면 내가 뭔가를 놓친 것 같아. 내가 너무 많은 콩을 쏟지 않고있는 상황을 설명하려고 노력하자. 데이터를 테이블로 보내는 '큐'메서드가 있습니다. 'queue'가 클래스 수준의 변수를 실행하려면 $ transport가 설정되어야합니다. 그렇지 않으면 오류가 발생합니다 (어디를 가는지 모르기 때문에).$ transport를 null 이외의 값으로 설정해야하고 setter가 인수를 반환하지 않아야합니다. (기존의 레거시 코드를 호출하는 '대기열'메소드에 대한 getter가 없습니다 ...) – Enrique

5

http://www.phpunit.de/manual/current/en/test-doubles.html이 몰라 참조 : 예컨대, 그것은 반환해야 무엇을 이야기하지만 나를 위해에 보인다. __get 마법 메서드를 오버라이드 된 메서드 중 하나처럼 넣는 경우 당신은 당신이 성공적으로 여기

$mock->transport = 'smtp'; 
11

을 할 수 있습니다

$mock = $this->getMock('Mail', array('__get')); 

나를 위해 작동하는 것입니다 :

$stub = $this->getMock('SomeClass'); 
$stub->myvar = "Value"; 
+1

이 질문에 대한 답변이 가장 간단하다고 대답합니다. 포스터는 메서드가 아닌 인스턴스 변수에 대해 묻습니다. 몇 가지 다른 해답은 방법에 초점을 맞추는 것 같습니다. @ Nat의 대답은 __get 메소드 (적어도 최신 버전이 아님)를 재정의 할 필요가 없다는 것을 제외하고는 이것과 동일합니다. –

+0

멋지게 완료되었습니다. PhpUnit. –

0

는 나는 당신이 한 코멘트에 토론을 고려하여 다음과 같은 제안 것 @ 고든.

필자가 알아야 할 것은 실제로 구현중인 실제 논리가 아니라 getters/setters를 실제로 테스트하고 있다는 것입니다.

테스트 할 수있는 작은 청크로 코드를 분류해야합니다.

그런 다음 작은 방법에서 기대하는 데이터를 테스트합니다. (보호 된 메서드를 테스트 할 수 있습니다.)

실제 코드에서는 작은 코드 (메서드)를 호출하고 다른 공용 함수에서 원하는 개체를 채울 수 있습니다 (개체를 설정하고 변수를 가져 오기 때문에 테스트하지 않아야 함). 테스트 할 가치가 없어도 간단해야합니다.)

관련 문제