Unit testing 用于比较服务器返回字符串的单元测试

Unit testing 用于比较服务器返回字符串的单元测试,unit-testing,ios5,ocunit,Unit Testing,Ios5,Ocunit,我正在努力学习单元测试。下面是我第一次编写的用于比较从服务器返回的字符串的单元测试。我确信我处理互联网连接可用性和通知的方式并不完美。Test testGetURLEncodedString始终打印通过,因为其中没有assert语句。我不能将assert放在那里,因为我必须在收到响应后比较服务器返回的结果。谁能告诉我正确的方法吗 #import "MyAppTests.h" @interface MyAppTests() @property(nonatomic) AppDelegate

我正在努力学习单元测试。下面是我第一次编写的用于比较从服务器返回的字符串的单元测试。我确信我处理互联网连接可用性和通知的方式并不完美。Test testGetURLEncodedString始终打印通过,因为其中没有assert语句。我不能将assert放在那里,因为我必须在收到响应后比较服务器返回的结果。谁能告诉我正确的方法吗

#import "MyAppTests.h"

@interface MyAppTests()
    @property(nonatomic) AppDelegate *delegate;
@end

@implementation MyAppTests

@synthesize delegate = _delegate;

- (void)setUp
{
    [super setUp];

    self.delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if(![self.delegate internetConnectionAvailable])
    {
      STFail(@"Internet is not reachable.");
      exit(-1);
    }
}

- (void)tearDown
{
    _delegate = nil;
     [super tearDown];
}

- (void)testDelegate
{
     STAssertNotNil(self.delegate, @"Cannot find the application delegate");
}

- (void)testGetURLEncodedString
{
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getURLEncodedStringSuccess:) name:@"getURLEncodedStringSuccess" object:nil];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getURLEncodedStringFailed:) name:@"getURLEncodedStringFailed" object:nil];

    [self.delegate getURLEncodedString:@"Testing Text"];
}

-(void)getURLEncodedStringSuccess:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringSuccess" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringFailed" object:nil];

    STAssertTrue([[self.delegate getURLEncodedStringResponse] isEqualToString:@"Testing Text"], @"testGetURLEncodedString failed - did not receive expected response");
 }

-(void)getURLEncodedStringFailed:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringSuccess" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"getURLEncodedStringFailed" object:nil];

    STFail(@"testGetURLEncodedString failed - server failed returning result");
}

调用服务器并检查响应的自动测试最好称为服务器的“验收测试”。但它们应该和应用程序的单元测试目标放在一个单独的目标中,因为单元测试需要非常快。让他们保持快速的主要方法是避免任何真正的网络。这已经有点进步了


由于您刚刚开始使用OCUnit,我建议您不要从验收测试开始,因为它们通常更难编写,并且提供的反馈也不太准确。相反,从最简单的测试开始,即对模型逻辑的测试。我的工作可能有助于学习单元测试的机制。

这不是单元测试。这可能是一个完整的系统测试。单元测试将测试(在单独的测试中)是否生成了正确的请求,是否包含正确的值,是否正确地传递给网络库。然后,您可以对服务器代码进行一些,甚至几十个测试。当然,对于请求接受、发送到其他代码以及创建实际响应的代码所涉及的所有层,需要进行单独的测试。谢谢@delnan,我想我需要阅读一些关于单元测试的书籍!我注意到我从未收到过testGetURLEncodedString的通知。我如何准确地测试服务器是否返回了预期的响应?谢谢Jon提供的信息。那么,在哪里编写验收测试呢?他们不是参加了OCUnit测试项目吗?谢谢。你的保龄球比赛卡塔项目的细节看起来非常好。谢谢。验收测试,即使用应用程序作为测试服务器的引擎,仍然可以在您的项目中进行。但是把它们放在第二个测试目标中(我把我的称为“服务器测试”)。好的。这是有道理的。如果考虑TestGuurLoudEdScript验收测试,是正确的做法吗?问题是我没有收到委托的getURLEncodedString方法发出的任何通知,因为在它收到通知之前,测试会成功通过!!我真的很困惑如何处理这种情况。不,这个测试对我来说没有意义——它没有遵循正常的习惯用法。给我发电子邮件jon@qualitycoding.org我会尽力帮你离线。