2012-04-13 111 views
1

對於我的項目想要做一點TDD,雖然我是相當新的目標C和單元測試。我創建了一個連接到返回json響應的web服務的項目。現在,我已經創建了一個單元測試來模擬Web服務,它總是崩潰(甚至沒有失敗的),和我完全此刻失去了....單元測試與嘲笑的Web服務不斷崩潰

我有以下設置:

SignUpService(創建一個新帳戶),它使用ServiceHelper(這使得實際的http web服務請求)。像這樣ServiceHelper.h

@protocol ServiceHelperProtocol <NSObject> 
@required 
- (NSString *)get:(NSString *)url; 
@end 

@interface ServiceHelper : NSObject <ServiceHelperProtocol> { 
    NSMutableData *receivedData; 
} 

而且SignUpService.h

@class ServiceHelper; 

@protocol SignUpServiceProtocol <NSObject> 
- (NSString *)createUserAccount:(CreateUserAccountRequest *)createUserAccountRequest; 
- (bool)doesUsernameExist:(NSString *)userName; 
- (BOOL)isEmailValid:(NSString *)email; 
- (BOOL)doesEmailExist:(NSString *)email; 
@end 

@interface SignUpService : NSObject <SignUpServiceProtocol> { 
    id <ServiceHelperProtocol> serviceHelper; 
} 

@property(strong) id <ServiceHelperProtocol> serviceHelper; 
- (id)initWithHelper:(id <ServiceHelperProtocol>)myServiceHelper; 

接下來是單元測試(SignUpServiceTests.h和實施)

@interface SignUpServiceTests : SenTestCase { 
    id <NSObject, ServiceHelperProtocol> serviceHelper; 

    SignUpService *signUpService; 
    CreateUserAccountRequest *createUserAccountRequest; 
} 
@property(nonatomic, strong) SignUpService *signUpService; 
@property(nonatomic, strong) CreateUserAccountRequest *createUserAccountRequest; 
@property(nonatomic, strong) id <NSObject, ServiceHelperProtocol> serviceHelper; 

和實現:

@implementation SignUpServiceTests 

@synthesize signUpService; 
@synthesize createUserAccountRequest; 
@synthesize serviceHelper; 

- (void)setUp { 
    [super setUp]; 

    // Set-up code here. 
    self.createUserAccountRequest = [[CreateUserAccountRequest alloc] init]; 
    self.createUserAccountRequest.firstName = @"first-name"; 
    self.createUserAccountRequest.lastName = @"last-name"; 
    ..... 

    self.serviceHelper = [ServiceHelper new]; 

    self.signUpService = [[SignUpService alloc] initWithHelper:(id <ServiceHelperProtocol>) self.serviceHelper]; 
} 

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

- (void)testOnCreateUserAccountShouldReturnCreatedUserIdWhenCorrectResponseFromService { 
    id mock = [OCMockObject partialMockForObject:(NSObject *) (id <ServiceHelperProtocol>) self.serviceHelper]; 
    [[[mock stub] andReturn:@"{\"status\":\"ok\",\"create_user\":\"12\"}"] get:[OCMArg any]]; 

    assertThat([self.signUpService createUserAccount:self.createUserAccountRequest], equalTo(@"12")); 
} 

該項目包含OCMock版本1.77和OCHamcrest庫。

由於某些原因,測試不斷崩潰「處理完成退出碼0」。當我正在調試時,我看不到發生了什麼問題。我覺得這與內存管理有關,還是與OCMock和ARC有關? (如建議herehere

的新手目標C開發的任何想法或建議?

回答

0

而不必進一步的信息我會懷疑這是因爲內存問題,而是因爲當octest啓動加載器無法找到OCMock框架沒有。在OS X中,鏈接器(在構建時)使用不同的方式來定位框架而不是加載器(在運行時)。

OCMock的公開版本是在加載路徑中使用@rpath構建的。這可以在運行時爲項目佈局提供相當程度的靈活性,但起初可能會造成混淆。作爲第一步,您是否可以確保將LC_RPATH環境變量設置爲包含OCMock框架可用的目錄? dyld手冊頁上對@rpath的討論更詳細。

順便說一句,OCMock 2.0最近發佈了。

+0

喜埃裏克,感謝您的評論。我不太這個編譯器/環境設置,你能幫我在哪裏,我需要把在Xcode這些變量或@rpath? – 2012-04-17 15:21:57