HTTP服务器在Cocoa应用程序中工作但不是测试用例—运行循环问题?

我正在尝试为此SimpleHTTPServer示例添加一个GHUnit测试用例。这个例子包括一个适合我的Cocoa应用程序。但我不能在测试用例中复制行为。 这是测试类:
#import <GHUnit/GHUnit.h>
#import "SimpleHTTPServer.h"


@interface ServerTest : GHTestCase
{
    SimpleHTTPServer *server; 
}
@end


@implementation ServerTest

-(void)setUpClass
{
    [[NSRunLoop currentRunLoop] run]; 
}

- (NSString*)requestToURL:(NSString*)urlString error:(NSError**)error
{
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:1]; 
    NSURLResponse *response = nil; 
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error]; 
    NSString *page = nil; 
    if (error == nil)
    {
        NSStringEncoding responseEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)[response textEncodingName]));
        page = [[NSString alloc] initWithData:data encoding:responseEncoding]; 
        [page autorelease];
    }
    return page; 
}

- (void)testPortReuse
{
    unsigned int port = 50001; 
    NSError *error = nil; 
    NSString *path, *url; 

    server = [[SimpleHTTPServer alloc] initWithTCPPort:port delegate:self]; 
    sleep(10); 
    path = @"/x/y/z"; 
    url = [NSString stringWithFormat:@"http://localhost:%u%@", port, path]; 
    [self requestToURL:url error:&error]; 
    GHAssertNil(error, @"%@ : %@", url, error); 
    [server release]; 
}

- (void)processURL:(NSURL *)path connection:(SimpleHTTPConnection *)connection
{
    NSLog(@"processURL"); 
}

- (void)stopProcessing
{
    NSLog(@"stopProcessing"); 
}

@end
我已尝试通过NSURLRequest发送请求,并且(在
sleep
期间)通过Web浏览器发送请求。从不调用委托方法
-processURL
-stopProcessing
。问题似乎是SimpleHTTPServer
-initWithTCPPort:delegate:
中的
[fileHandle acceptConnectionInBackgroundAndNotify]
没有导致任何NSFileHandleConnectionAcceptedNotifications到达NSNotificationCenter - 所以我怀疑涉及运行循环的问题。 问题似乎在于NSFileHandle,而不是NSNotificationCenter,因为当
[nc postNotificationName:NSFileHandleConnectionAcceptedNotification object:nil]
添加到
initWithTCPPort:delegate:
的末尾时,NSNotificationCenter会收到通知。     
已邀请:
if (error == nil)
那应该是:
if (data != nil)
error
这里是指向NSError *的传入指针 - 如果调用者传递的是nil而不是对NSError *对象的引用,它将只是nil,这不是你的
-testPortReuse
方法所做的。 取消引用它也是不正确的(如
if (*error == nil)
),因为错误参数不能保证在出错时设置为nil。返回值表示错误条件,并且如果出现错误,则error参数中返回的值仅有意义或可靠。始终检查返回值以确定是否发生错误,然后仅在事实确实出错的情况下检查错误参数以获取详细信息。 换句话说,如上所述,你的
-requestToURL:error:
方法无法处理成功。很像Charlie Sheen。 :-)     

要回复问题请先登录注册