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会收到通知。
没有找到相关结果
已邀请:
1 个回复
邦绊门蔽惩
那应该是:
这里是指向NSError *的传入指针 - 如果调用者传递的是nil而不是对NSError *对象的引用,它将只是nil,这不是你的
方法所做的。 取消引用它也是不正确的(如
),因为错误参数不能保证在出错时设置为nil。返回值表示错误条件,并且如果出现错误,则error参数中返回的值仅有意义或可靠。始终检查返回值以确定是否发生错误,然后仅在事实确实出错的情况下检查错误参数以获取详细信息。 换句话说,如上所述,你的
方法无法处理成功。很像Charlie Sheen。 :-)