Is it possible to unit test a static library project using XCode's SenTestingKit?
Asked Answered
B

4

14

I've created an iOS unit test target for doing logic tests following the steps provided in Apple's documentation.

However my build fails and i get the following error:

Undefined symbols:
"_OBJC_CLASS_$_MyClass", referenced from: objc-class-ref-to-MyClass in LogicTests.o ld: symbol(s) not found collect2: ld returned 1 exit status

Ordinarily, if I wanted to use my static library within an application I would include the library.a file, and the headers(including the MyClass.h file...). Is something additional required to run logic tests on a static library WITHIN that same project if my test cases are utilizing MyClass.h ?

Tjhanks

Buatti answered 16/12, 2010 at 20:52 Comment(1)
Good question. Bad answer sir. The truth is, due to the nature of a static library, you can't perform application tests.Luxor
B
3

I actually just solved it. I had to copy all of the .m files in my project to the LogicTest target's 'Compile Sources'. As well as add the frameworks the sources reference to the 'Link Binary With Libraries' section of the target.

I hope this helps others

Buatti answered 16/12, 2010 at 21:41 Comment(4)
Actually, for a static library, you're better off not including your sources in your test target. You do have add your .m files if you're not working with a static library.Furthermore
Jon, that's kind of confusing, can you be a bit clearer? Why would you be better off?Raster
It's a pain because every time you create a new file, you have to remember to add it to two targets. Xcode lets you keep your test code separate from the code under test, linking the former to the latter.Furthermore
Copying and compiling the .m files defeats the purpose of having a static library in the first place. Basically, logic tests are not possible using XCTests. Application tests are however possible. The sample app mentioned by @Eskridge makes this clear, particularly in the readme file.Kingcup
L
16

Due to the nature of static libraries, you can't perform application tests, which by the sound of it is what you are trying to do. However, you can perform logic tests.

You were correct in your observation about unit testing in the client application.

The Xcode template optionally includes unit tests, but if you go to the build settings for that unit test you will see it doesn't specify a test host or bundle loader. This is because of the nature of static libraries. They are not applications, they are libraries - so you can do logic tests, you cannot do application tests.

Application tests you may wish to perform on your static library may include the following scenario:

My library creates an SQLite database at runtime, I wish to perform a unit test to check everything is inserting and/or updating as expected.

In order to test this with unit tests, one must create another application which includes or otherwise is dependant of your library. This application then includes your library and application tests may then be set up there.

Luxor answered 29/6, 2012 at 19:15 Comment(1)
can you explain this statement ? "Due to the nature of static libraries, you can't perform application tests" .Damascus
E
4

Apple has a sample up (UnitTests) that shows how to do this: https://developer.apple.com/library/ios/#samplecode/UnitTests/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011742

Eskridge answered 31/5, 2012 at 19:17 Comment(0)
B
3

I actually just solved it. I had to copy all of the .m files in my project to the LogicTest target's 'Compile Sources'. As well as add the frameworks the sources reference to the 'Link Binary With Libraries' section of the target.

I hope this helps others

Buatti answered 16/12, 2010 at 21:41 Comment(4)
Actually, for a static library, you're better off not including your sources in your test target. You do have add your .m files if you're not working with a static library.Furthermore
Jon, that's kind of confusing, can you be a bit clearer? Why would you be better off?Raster
It's a pain because every time you create a new file, you have to remember to add it to two targets. Xcode lets you keep your test code separate from the code under test, linking the former to the latter.Furthermore
Copying and compiling the .m files defeats the purpose of having a static library in the first place. Basically, logic tests are not possible using XCTests. Application tests are however possible. The sample app mentioned by @Eskridge makes this clear, particularly in the readme file.Kingcup
A
2

Yes, Xcode 4.2 has a template for Cocoa Touch Static Library with tests.

Adelia answered 20/8, 2011 at 14:48 Comment(1)
Yup! Sadly, it only seems to support logic tests.Furthermore

© 2022 - 2024 — McMap. All rights reserved.