program story

클래스 Foo는 MyApp 및 MyAppTestCase 모두에서 구현됩니다.

inputbox 2020. 11. 25. 07:57
반응형

클래스 Foo는 MyApp 및 MyAppTestCase 모두에서 구현됩니다. 둘 중 하나가 사용됩니다. 어느 것이 정의되지 않았습니까?


최근에 애플리케이션 단위 테스트를 시작했습니다. 이 프로젝트 (Xcode4)는 단위 테스트 번들없이 생성 되었기 때문에 설정해야했습니다. 나는 여기에서 단계를 따랐습니다 : http://cocoawithlove.com/2009/12/sample-mac-application-with-complete.html 그리고 그것은 간단한 클래스에서 잘 작동했지만 이제는 의존하는 클래스를 테스트하려고합니다. 다른 사람과 다른 사람, 등등.

먼저 링커 오류가 발생 *.m하여 테스트 케이스 대상 파일을 추가 했지만 이제 테스트하려는 모든 클래스에 대해 경고가 표시됩니다.

클래스 Foo는 MyApp 및 MyAppTestCase 모두에서 구현됩니다. 둘 중 하나가 사용됩니다. 어느 것이 정의되지 않았습니다.

왜 그럴까요? 어떻게 해결할 수 있습니까? 단위 테스트 대상을 설정할 때 놓친 것이 있습니까?

편집-해결책

  • "번들 로더"를 올바르게 설정하십시오. $(BUILT_PRODUCTS_DIR)/AppName.app/AppName

  • "기본적으로 숨겨진 기호"를 아니요로 설정합니다 (대상 응용 프로그램의 빌드 설정에서). 링커 오류는 기본적으로 YES이므로 여기에서 발생합니다. 나는 이것으로 너무 오래 고생했습니다!.

출처 : XCode 4와의 단위 테스트 연결 오류?


클래스 Foo는 MyApp 및 MyAppTestCase 모두에서 구현됩니다. 둘 중 하나가 사용됩니다. 어느 것이 정의되지 않았습니다.

왜 그럴까요?

두 이미지 (앱 및 단위 테스트 번들) 모두 클래스 구현을 정의하기 때문입니다. 클래스는 objc 런타임에 동적으로로드됩니다. objc 런타임은 플랫 네임 스페이스를 사용합니다. 작동 원리 :

  • 바이너리는 의존성으로 시작하여로드됩니다.
  • 각 바이너리가로드되면 objc 클래스가 objc 런타임에 등록됩니다.
  • 특정 이름의 클래스가 두 번로드되면 동작이 정의되지 않습니다. 하나의 클래스 구현 (동일한 이름)을 objc 런타임에로드 할 수 있습니다.

전형적인 여기에 문제가 하나 구현을 반환 할 것입니다 - 앱이 가능성이 충돌합니다을 때 유형 충돌 (클래스가 동일한 소스 파일에서 제공하지 않는 경우).

일반적으로 클래스 이름을 바꾸거나 클래스를 하나의 이미지로 내 보내면이를 방지 할 수 있습니다. 클래스 이름을 바꾸는 것은 분명히 귀하의 경우에 적용되지 않습니다. 하나에 Foo.m있어야 할 때 두 개의 이미지에 의해 컴파일, 내보내기 및로드되는 하나의 파일 이 있습니다.

이것은 중복 심볼 링커 오류로 해석되어야합니다. 구현이 동일한 소스 파일이고 구현이 동일하더라도-이 문제는 수정해야합니다.

어떻게 해결할 수 있습니까?

경우 Foo.m응용 프로그램의 클래스가, 당신은 제거해야합니다 (컴파일하지 않고 링크) Foo.m단위 테스트에서. 단위 테스트의 일부인 경우 컴파일하여 단위 테스트 대상에 연결하지 마십시오.

그런 다음 게시물의 지침에 따라 단위 테스트를 앱에 연결 /로드합니다. 게시물의 일반적인 영역에 있습니다. 여기서 "WhereIsMyMac"은 단위 테스트중인 응용 프로그램의 이름입니다. 이렇게하면 테스트 대상이 응용 프로그램에 연결될 수 있으므로 컴파일 할 때 링커 오류가 발생하지 않습니다. 중요한 부분은 테스트 파일이 단위 테스트 대상에서만 컴파일되고 앱의 클래스가 컴파일되어 앱에 연결된다는 것입니다. 단순히 추가 할 수는 없습니다. 동적으로 연결되고로드됩니다.

단위 테스트 대상을 설정할 때 놓친 것이 있습니까?

링크 한 기사에서 :

참고 : 테스트 대상은 별도의 대상입니다. 이는 대상 멤버십에주의해야 함을 의미합니다. 모든 애플리케이션 소스 파일은 애플리케이션 대상에만 추가해야합니다. 테스트 코드 파일은 테스트 대상에만 추가해야합니다.

틀린 부분은 아마도 단위 테스트 번들의 링크 및로드 단계 일 것입니다.


Cocoapods를 사용하는 경우 podfile에는 테스트 대상이 아닌 기본 대상에 대한 섹션의 종속성 만 필요합니다. 테스트 대상에 대한 중복 종속성을 추가하면 OP의 오류 메시지가 표시됩니다.

target 'MyProject' do
pod 'Parse'

end

target 'MyProjectTests' do

end

target 'MyProjectUITests' do

end

저에게 필요한 것은 Foo 클래스를 단위 테스트 대상의 구성원으로 만드는 확인란을 선택 취소하는 것뿐이었습니다. 두 대상의 구성원이 아니어야하며 다음과 같아야합니다.

대상 멤버십

이미지를 볼 수없는 경우는 Xcode "Target Membership"창의 스크린 샷입니다. 대상에는 "A"응용 프로그램 아이콘이있는 대상과 테스트 이름이 있습니다. 다른 하나는 단위 테스트 대상이며 단위 테스트 아이콘이 있습니다.

Target Membership
[X] Foo
[ ] FooTests

나에게 이것은 NSZombies를 활성화했을 때 장치와 시뮬레이터에 배포했기 때문에 발생했습니다. 해결책은 시뮬레이터 구성으로 전환하고 제품-> 청소를 수행 한 다음 장치 구성으로 전환하고 동일한 작업을 수행하는 것이 었습니다. 오류가 사라졌습니다. 빌드 캐시와 관련이 있습니다.


그 이유는 RUNPATH_SEARCH_PATHS다른 대상에 정의 된 앱 대상의 빌드 설정 을 재정의하기 때문입니다 .

해결책:

앱 타겟으로 이동하여 RUNPATH_SEARCH_PATHS빌드 설정을 찾아 디버그릴리스$(inherited) 모두에 플래그를 사용합니다.


동일한 문제가 발생하면 내 상황은 NSNotification 클래스가 /System/Library/Frameworks/Foundation.framework/Foundation 모두에서 구현됩니다. 어떤 친구가 동일한 문제를 접하게되는지, 어떤 방향이나 조언이 적용됩니다.

참고 URL : https://stackoverflow.com/questions/6149673/class-foo-is-implemented-in-both-myapp-and-myapptestcase-one-of-the-two-will-be

반응형