Imported files not recognized in OCUnit

2019-04-30 04:12发布

问题:

I am doing unit testing on my iPhone app using OCUnit on XCode 3.2.3, and iOS 4.0. I have successfully set up my testing environment to pass and fail basic tests appropriately, but when I import my own files (in this case, "UserAccount.h", it fails to compile and tells me:

"_OBJC_CLASS_$_UserAccount", referenced from:

It then says "Symbol(s) not found". This strikes me as some sort of linker error, but I have no idea what's going on. I have built and cleaned all targets numerous times, but to no avail. Here is my testing code:

#import "SomeTestCase.h"
#import "UserAccount.h"

@implementation SomeTestCase

 - (void)testUserAccount
 {
 // UserAccount.m //

 UserAccount *testAccount = [[UserAccount alloc] initWithUsername:@"" password:@"" deviceToken:@""];
 [testAccount registerNew];
 NSLog(@"USERID = %@", testAccount.userID);
 STAssertEquals([testAccount login], NO, @"Failure: Login should fail with blank username and password."); // should fail with no username or password

 UserAccount *testAccount2 = [[UserAccount alloc] initWithUsername:@"user" password:@"" deviceToken:@""]; 
 STAssertEquals([testAccount2 login], NO, @"Failure: Login should fail with blank password.");// should fail with no password

 UserAccount *testAccount3 = [[UserAccount alloc] initWithUsername:@"" password:@"pass" deviceToken:@""]; 
 STAssertEquals([testAccount3 login], NO, @"Failure: Login should fail with blank username.");// should fail with no password

 }

@end

Any advice would be greatly appreciated. Thanks!

-Matt

回答1:

I would guess that UserAccount.m has not been added to the testing target. That will cause the "Symbols not found" error. I seen times with multiple targets in which Xcode recognizes headers even though the implementation file is not part of target.

If that doesn't work, try emptying the Xcode cache with Xcode>Empty Caches....



回答2:

In XCode 4 at least you should not include your application .m files in your test target. The proper way to do this is:

  1. Your Project (top left) -> Targets -> Your Test Target -> Target Dependencies -> + Your main app target
  2. Switch to Build Settings Tab -> Linking -> Bundle Loader -> $(BUILT_PRODUCTS_DIR)/YourAppName.app/YourAppName

A good way to see how this is properly done is to create a brand new XCode 4 project with unit tests and then see how the test target is setup. You'll notice the application .m files are not included in the test target.