2012-06-07 57 views
1

沒有在我測試的代碼,我有一個NSPredicate,我過濾的數組:OCMock valueForKey與NSPredicate

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status == %d || status == %d", FVFileReadyStatus, FVFileWaitingStatus]; 
[myArray filterUsingPredicate:predicate]; 

我有一個方法返回一個模擬,最終將被添加到myArrayFVFileStatus是一個typedef枚舉。因爲我使用的是謂語,謂語呼籲valueForKey,所以我需要存根出來:

-(id)mockFVFileHandleWithStatus:(FVFileStatus)status { 
    id mock = [OCMockObject mockForClass:[FVFileHandle class]]; 
    [[[mock stub] andReturnValue:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]]; 
    return mock; 
} 

當我運行我的測試,它無法在過濾器上。我得到一個NSInvalidArgumentException - Reason: Return value does not match method signature

我不知道如何設置存根,所以它將與NSPredicate一起使用。

任何人都可以幫忙嗎?

回答

3

非常接近。建立存根的正確方法如下:

[[[mock stub] andReturn:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]]; 

這似乎與直覺相反,在第一,因爲你試圖存根屬性的類型INT的,正因爲如此,你會預計必須使用和返回值:

然而,這被稱爲模擬對象的實際方法不是狀態valueForKey:對於後者的返回類型爲ID。因此,在使用和返回值:時,存根被設置爲返回一個原始值,然後在請求提供對象時發出抱怨。順便說一下,錯誤信息可能會更清晰,我會研究這一點。

,您仍然可以使用OCMOCK_VALUE宏設置一個值對象,但通過使用andReturn:你告訴存根返回值對象,而不是原始的多數民衆贊成裹在裏面,那是什麼與valueForKey兼容:的返回類型。

+0

我敢肯定,你不需要使用 - [OCMArg checkWithSelector:],並可以使用字符串作爲-valueForKey:參數。 – Greg