簡體   English   中英

在Swift單元測試中模擬Objective-C代碼

[英]Mocking Objective-C code in Swift Unit-Tests

注意: 這不是我的實際代碼,因此我以一種簡單的方式在此處重新輸入了代碼,以幫助您。


我有這個用Objective-C編寫的課程

@interface MySpecialManager <NSObject>

+ (MySpecialManager *)sharedInstance;
-(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo;
-(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo success:(void (^)(NSString *))success failure:(void (^)(NSError *error))failure;

@end

我對具有成功/失敗塊的第二個功能進行單元測試(在Swift中),但是我現在嘗試為第一個功能編寫單元測試。 該函數所做的全部就是調用第二個函數。 因此,我認為最好的測試方法是檢查第二個函數是否確實被調用並使用正確的參數。 因此,我認為模擬/存根是前進的方法,但我一直在努力了解如何准確地對此進行單元測試。

從很多谷歌搜索中,我讀到創建自己的Mock對象將是前進的方式,所以現在有了(用Swift編寫):

class MockMySpecialManager: NSObject, MySpecialManagerProtocol {

var functionOneWasCalled = false
var functionTwoWasCalled = false

func someFunctionWithParamOne(paramOne: String!, andParamTwo paramTwo: String!) {
    functionOneWasCalled = true
}

func someFunctionWithParamOne(paramOne: String!, andParamTwo paramTwo: String!, success: ((String!) -> Void)!, failure: ((NSError!) -> Void)!) {
    functionTwoWasCalled = true
}

如果在測試中雖然我初始化了MockMySpecialManager並調用了第一個方法,則它不會調用第二個方法,因為它只是更新了布爾值,對嗎? 我可以更新模擬函數以調用第二個函數,但這感覺像作弊,而不是真正的單元測試,因為它沒有測試我的代碼。 我該如何測試?

我以某種方式(或我認為)需要將管理器設置為MySpecialManager.sharedInstace() ,調用第一個方法,然后檢查是否在模擬中調用了第二個方法。

有什么幫助嗎? 我有什么誤解/我要去哪里錯?

您當前的MOC類實際上是目標類的完整替代品,因此您實際上根本沒有對其進行測試。

如果您的MOC是目標類的子類,並且僅實現了第二個方法,則測試可以調用第一個方法,而MOC可以驗證是否調用了第二個方法。

通常,您會使用一個模擬庫來完成此任務,而這些庫允許您使用不同的方式來完成與上述相同的操作。

或者,您將不MOC目標類,而是將其所有依賴項MOC。 然后,您的測試將檢查依賴項是否已正確調用並且具有必需的參數。 然后,您的第一方法測試和第二方法測試是相同的設置,但期望值稍有不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM