반사를 사용하여 단위 테스트에서 속성 설정

암호

내 시나리오는 다음과 같습니다.

코드 중복을 줄이기 위해 추상 클래스를 만들고이 클래스를 확장하는 구체적인 클래스에 의해 구현되도록 일부 메서드를 적용했습니다.

추상 클래스 BaseClass 
{ 
    보호 된 $ arrayField; 
   
    ... 

    public function getModifiedArrayField ($ constraints) 
    { 
        // $ arrayField에 작업을 수행하고 // arrayField의 수정 된 
        버전을 반환합니다 . 
        // $ constraints 에만 의존 하며 일부`array_ *`함수 
        는 $ modifiedArray를 반환합니다. 
    } 

    // ... 코드 중복을 줄이기위한 다른 메서드 

    // ... 구현해야하는 추상 메서드 

}

추상 클래스 자체에서 구체적인 메서드를 테스트하는 것이 좋은 생각이라고 생각했습니다.

$arrayField콘크리트 클래스의 추상적 인 방법으로 채워집니다.

해당 속성을 수정하지만 변경하지는 않는 메서드의 기능을 테스트하고 싶었 기 때문에 다음과 같이 단위 테스트를 작성했습니다.


class BaseClassTest 범위 PHPUnit_Framework_TestCase 

    private $ sut; 

    public function setUp () 
    { 
        $ mockObj = $ this-> getMockFromAbstractClass (BaseClass :: class); 
        $ ref = 새로운 ReflectionClass ($ mockObj); 
        $ ref_prop = $ ref-> getProperty ( 'arrayField'); 
        $ ref_prop-> setAccessible (true); 
        $ ref_prop-> setValue ($ mockObj, [an_array]); 
        $ this-> sut = $ mockObj; 
    } 

    // .. 추상 클래스의 메서드를 테스트하는 일부 테스트 메서드 

    public function testGetModifiedArrayFieldReturnsExpectedArray () 
    { 
        $ expected = [array_i_expect]; 
        $ actual = $ this-> sut-> getModifiedArrayField ([constraints_i_provide]);
        
        $ this-> assertEquals ($ expected, $ actual); 
    }

이제 테스트를 위해 Reflection을 사용하여 가시성을 변경하는 것은 좋은 습관이 아니라는 것을 읽었습니다.

그래서 두 가지 질문이 있습니다.

  1. 테스트 커뮤니티에서는이 접근 방식이 큰 범죄가 아닌 '경범죄'라고 생각합니까?
  2. 반사를 없앨 수 있도록이 클래스를 다르게 디자인해야합니까? 그렇다면 어떤 접근 방식을 제안 하시겠습니까?

최신 정보:

대답 하여 Schleis은 나를 생각하고, 인터넷에 내 친구와 함께 약간의 채팅 및 일부 리소스 후에 내가 시험에 필요한 기능을 추가 인수를 도입하여이 문제를 해결하기 위해 선택되었다.

함수를 일반화하고 ArrayHelper 종류의 클래스로 이동하여 추가로 진행하여 1) 테스트를 더 쉽게 수행하고 2) 필요한 경우 코드의 다른 부분에서 메서드를 활용할 수 있습니다.

자물쇠

리플렉션 사용의 문제점은 클래스 내부를 노출한다는 것입니다. 단위 테스트는 코드가 올바르게 작동 함을 입증하는 데 도움이되지만 리팩터링하고 현재 기능을 변경하지 않았는지 확인할 수도 있습니다.

따라서 리플렉션을 사용하여 내부 속성의 가시성을 변경하면 나중에 해당 속성을 제거 / 변경할 수 있습니다. 예를 들어, 즉석에서 또는 이와 유사한 것을 계산할 수 있다는 것을 알 수 있습니다.

클래스 테스트에서 어려운 것은 코드 냄새입니다.

$arrayField추상적 인 방법으로 만 설정되는 이유는 무엇 입니까? 호출하기 전에이 클래스의 구현에서 해당 메서드를 호출하지 않으면 어떻게됩니까 getModifiedArrayField()?

게시물의 이름과 설명을 기반으로이 클래스와 메서드로 의도하는 바를 말하기는 어렵습니다. 하지만 수업에서하고 싶은 일이 무엇인지 더 많이 고려해야 할 것 같습니다. 그리고 $arrayField생성자에 제공 되도록 클래스를 변경하거나이 클래스 의 값을 설정하는 간단한 공용 메서드를 제공합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

마우스 위치에 따라 자바 스크립트를 사용하여 CSS '상단'속성 설정

분류에서Dev

mockery를 사용하여 종속성이있는 클래스 단위 테스트

분류에서Dev

Swift의 사용자 지정 UIView 하위 클래스에서 UIAppearance를 통해 텍스트 속성 설정

분류에서Dev

jmockit 단위 테스트에서 시스템 속성 설정

분류에서Dev

새로 생성 된 객체에 속성을 설정하는 서비스 단위 테스트 방법

분류에서Dev

HttpWebRequest / Response 종속성을 사용하여 메서드를 단위 테스트하는 방법

분류에서Dev

GraphClient를 사용하여 365 그룹에서 사용자 지정 속성 설정

분류에서Dev

Moq를 사용하여 단위 테스트 정렬

분류에서Dev

Laravel 단위 테스트가 사용자 지정 속성으로 실패 함

분류에서Dev

반사를 사용하여 제어 속성 설정

분류에서Dev

Postgis + Rails를 사용하여 모델에 거리 속성 설정

분류에서Dev

메서드 내에 종속성이있는 moq를 사용하여 클래스를 단위 테스트하는 방법은 무엇입니까?

분류에서Dev

환경 설정 실행 가능 경로를 사용하여 시스템 단위 파일 작성

분류에서Dev

Swift에서 NSRegularExpression을 사용하여 특정 범위 내의 단어 속성 지정

분류에서Dev

mongoose.find () 메서드를 사용하여 생성자에서 자바 스크립트 객체 속성 설정

분류에서Dev

SpringBoot에서 Hibernate를 사용하여 DAO 계층에 대한 단위 테스트 구성

분류에서Dev

SOAPUI 속성 테스트 단계에서 객체를 재사용하는 방법

분류에서Dev

ScalaTest를 사용하여 Playframework 단위 테스트에서 CRUD 기능 테스트

분류에서Dev

많은 종속성을 사용하여 단위 테스트를 올바르게 수행하는 방법

분류에서Dev

Birt보고에서 자바 스크립트를 사용하여 속성을 설정하는 방법

분류에서Dev

벡터로 구성된 벡터를 사용하여 단위 행렬 설정 C ++

분류에서Dev

생성자에 CheckedProviders를 사용하여 클래스에 대한 단위 테스트를 작성하는 방법

분류에서Dev

resteasy를 사용하여 동일한 사이트 쿠키 속성 설정

분류에서Dev

pytest를 사용하는 단위 테스트를 위해 "설정"메소드에서 monkeypatch를 사용하는 방법은 무엇입니까?

분류에서Dev

Google Test 및 CMake를 사용하여 하위 폴더에서 테스트 구성

분류에서Dev

Selenium WebDriver에서 JavascriptExecuter를 사용하여 속성 값을 설정하는 방법

분류에서Dev

단위 테스트에서 개인 변수를 설정하는 방법

분류에서Dev

변수를 사용하여 자바 스크립트로 SVG 속성 설정

분류에서Dev

unittest 및 pytest 패키지를 사용하여 작성된 테스트에 대한 단위 테스트 범위 보고서

Related 관련 기사

  1. 1

    마우스 위치에 따라 자바 스크립트를 사용하여 CSS '상단'속성 설정

  2. 2

    mockery를 사용하여 종속성이있는 클래스 단위 테스트

  3. 3

    Swift의 사용자 지정 UIView 하위 클래스에서 UIAppearance를 통해 텍스트 속성 설정

  4. 4

    jmockit 단위 테스트에서 시스템 속성 설정

  5. 5

    새로 생성 된 객체에 속성을 설정하는 서비스 단위 테스트 방법

  6. 6

    HttpWebRequest / Response 종속성을 사용하여 메서드를 단위 테스트하는 방법

  7. 7

    GraphClient를 사용하여 365 그룹에서 사용자 지정 속성 설정

  8. 8

    Moq를 사용하여 단위 테스트 정렬

  9. 9

    Laravel 단위 테스트가 사용자 지정 속성으로 실패 함

  10. 10

    반사를 사용하여 제어 속성 설정

  11. 11

    Postgis + Rails를 사용하여 모델에 거리 속성 설정

  12. 12

    메서드 내에 종속성이있는 moq를 사용하여 클래스를 단위 테스트하는 방법은 무엇입니까?

  13. 13

    환경 설정 실행 가능 경로를 사용하여 시스템 단위 파일 작성

  14. 14

    Swift에서 NSRegularExpression을 사용하여 특정 범위 내의 단어 속성 지정

  15. 15

    mongoose.find () 메서드를 사용하여 생성자에서 자바 스크립트 객체 속성 설정

  16. 16

    SpringBoot에서 Hibernate를 사용하여 DAO 계층에 대한 단위 테스트 구성

  17. 17

    SOAPUI 속성 테스트 단계에서 객체를 재사용하는 방법

  18. 18

    ScalaTest를 사용하여 Playframework 단위 테스트에서 CRUD 기능 테스트

  19. 19

    많은 종속성을 사용하여 단위 테스트를 올바르게 수행하는 방법

  20. 20

    Birt보고에서 자바 스크립트를 사용하여 속성을 설정하는 방법

  21. 21

    벡터로 구성된 벡터를 사용하여 단위 행렬 설정 C ++

  22. 22

    생성자에 CheckedProviders를 사용하여 클래스에 대한 단위 테스트를 작성하는 방법

  23. 23

    resteasy를 사용하여 동일한 사이트 쿠키 속성 설정

  24. 24

    pytest를 사용하는 단위 테스트를 위해 "설정"메소드에서 monkeypatch를 사용하는 방법은 무엇입니까?

  25. 25

    Google Test 및 CMake를 사용하여 하위 폴더에서 테스트 구성

  26. 26

    Selenium WebDriver에서 JavascriptExecuter를 사용하여 속성 값을 설정하는 방법

  27. 27

    단위 테스트에서 개인 변수를 설정하는 방법

  28. 28

    변수를 사용하여 자바 스크립트로 SVG 속성 설정

  29. 29

    unittest 및 pytest 패키지를 사용하여 작성된 테스트에 대한 단위 테스트 범위 보고서

뜨겁다태그

보관