2012-10-31 1 views
1

класс я написал разваливается мой тестовый случай с кодом ошибки 138. Класс возвращает NSString со строкой пользовательского агента из UIWebView:Почему мой класс разбивает мой тестовый пример OCUnit с кодом ошибки 138?

@interface MyWebViewUserAgent : NSObject <UIWebViewDelegate> { 
    NSString* userAgent; 
    UIWebView* webView; 
} 

- (NSString*) userAgentString; 

@end 

#import "MyWebViewUserAgent.h" 

@implementation MyWebViewUserAgent 

- (NSString*) userAgentString { 
    if (userAgent != nil) return userAgent; 

    webView = [[UIWebView alloc] init]; 
    webView.delegate = self; 
    [webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: @"http://127.0.0.1"]]]; 

    // Wait for the web view to load our bogus request and give us the secret user agent. 
     while (userAgent == nil) { 
     // This executes another run loop. 
     [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]; 
    } 

    NSString *currentDeviceType = [[UIDevice currentDevice] model]; 
    NSRange range = [userAgent rangeOfString:currentDeviceType]; 

    if (range.location == NSNotFound) { 

     // Should only happen when iPhone-targeted app is running on an iPad. 
     NSRange rangeToReplace = [userAgent rangeOfString:@"iPhone;"]; 
     if (rangeToReplace.length > 0) { 
      userAgent = [userAgent stringByReplacingCharactersInRange:rangeToReplace withString:@"iPad;"]; 
     } 
    } 
    return userAgent; 
} 

- (BOOL) webView: (UIWebView*) web_view shouldStartLoadWithRequest: (NSURLRequest*) request navigationType: (UIWebViewNavigationType) navigation_type { 
    userAgent = [request valueForHTTPHeaderField: @"User-Agent"]; 
    [webView release]; 
    return NO; // Return no, we don't care about executing an actual request. 
} 

- (void) dealloc { 
    [super dealloc]; 
} 

@end 

Теперь, вот мой тест:

#import <SenTestingKit/SenTestingKit.h> 
#import <UIKit/UIKit.h> 
#import "MyWebViewUserAgent.h" 

@interface MyUnitTests : SenTestCase { 
    MyWebViewUserAgent *ua; 
} 

@end 

@implementation MySDKUnitTests 

- (void)setUp 
{ 
    [super setUp]; 
} 

- (void)tearDown 
{ 
    // Tear-down code here. 
    [super tearDown]; 
} 

- (void)testUserAgentString { 
    ua = [[MyWebViewUserAgent alloc] init]; 
    STAssertNotNil(ua, @"User agent object is nil."); 
    STAssertNotNil([ua userAgentString], @"user agent string is nil"); 
    [ua release]; 
} 

@end 

Первый STAssertNotNil в тесте testUserAgentString работает нормально, но второй STAssertNotNil - это линия, которая выдает ошибку. Есть идеи?

+0

Является ли 'RhythmWebViewUserAgent' подкласс' MyWebViewUserAgent'? –

+0

Моя ошибка, я забыл изменить это имя класса в этом alloc-init. Исправлена. –

+0

Я просто создал проект с вашим кодом, и тест прошел. Так что это не ваш код, это что-то еще в настройках вашего проекта. У вас есть другие модульные тесты, которые работают? –

ответ

0

Ваш проект не настроен правильно для модульных испытаний. Попробуйте checking these settings. Если это не удается, попробуйте создать новый проект, выбрав «Включить тесты единиц».