2013-01-21 45 views
1

我在一個類的兩種方法我測試:驗證方法調用目標C與基本數組/指針參數

- (NSUInteger)sendBuffer:(uint8_t *)buffer length:(NSUInteger)length; 
- (BOOL)sendFormattedCommandForAddress:(uint8_t)address 
           withData:(uint8_t)data 
         andCommandType:(ZKZSensorCommandType)commandType; 

-sendFormattedCommandForAddress:withData:andCommandType:構建一個char陣列,並傳遞指向此數組-sendBuffer:length:。此數組的內容取決於address,datacommandType。在我的測試中,我想驗證是否構建了正確的數組並傳遞給-sendBuffer:length:。 OCMock不會讓我對uint8_t *的觀點設定一個期望。 OCMockito/OCHamcrest不會讓我使用部分模擬(還)。我試着用-sendBuffer:length:方法調用一個方法,在我的測試用例類中調用一個方法,並設置對該方法調用的期望。但是,當調用方法調用時,self指向被測試的類而不是我的測試用例。我可以在被測試的類中保存緩衝區,然後在我的測試中檢查這個緩衝區的內容,但是我討厭爲生產代碼添加一些東西來支持測試。有沒有人有更好的建議如何測試這種行爲?

回答

0

雖然這可以說是見仁見智的,全面的單元測試的好處使代碼複雜度太小,而增量值得權衡。在你描述的情況下,我認爲你的想法是在生產類中添加一個緩衝區,以便發送的最後一個字節序列可以在單元測試中被檢索和聲明,這是一個非常好的方法。

我個人可能會增加,其控制閹緩衝器保持或沒有,只是爲了避免任何意外的不必要的內存開銷如果較大的消息最終生產代碼正在發送的布爾屬性。單元測試設置當然會設置這個屬性,而應用程序/框架生產代碼則不會。再次,關鍵是要使添加的代碼如此簡單以至於顯然是正確的。 :-)

如果你希望或者需要嚴格嚴密的關於界面的生產類公開,你也可以考慮做緩衝maintianing代碼依賴於條件編譯。我個人比較喜歡前一種方法,但對每個人都是。

0

你並不需要一個模擬框架,使嘲笑。我認爲,挑戰在於你實際上並不想撥打-sendBuffer:length:。在這種情況下,只需使用子類並覆蓋方法,在邁克爾羽毛的書修改代碼有效地開展工作描述。

不知道你的類的名字,我會打電話給發件人。這是我會寫,把它直入SenderTest.m:

@interface TestingSender : Sender 
@property (assign, nonatomic) NSUInteger sendBufferCount; 
@property (assign, nonatomic) uint8_t *sendBufferBuffer; 
@property (assign, nonatomic) NSUInteger sendBufferLength; 
@end 

@implementation TestingSender 

- (NSUInteger)sendBuffer:(uint8_t *)buffer length:(NSUInteger)length 
{ 
    ++_sendBufferCount; 
    _sendBufferBuffer = buffer; 
    _sendBufferLength = length; 
} 

@end 

測試代碼,然後創建一個TestingSender而不是發件人。