[英]“python function decorator” for objective-c to change a method's behavior
我想修改某些函數的行為,而不是該函數的作者。 我控制的是,我可以要求作者遵循某種模式,例如使用基類,使用某種裝飾器,屬性等。
如果在python中,我將使用裝飾器來更改方法的行為。
例如,我的目標:通過自動測試多個輸入數據來提高代碼覆蓋率。
偽代碼:
@implementation SomeTestSuiteClass
// If in python, I would add a decorator here to change the behavior of the following method
-(void)testSample1 {
input = SpecialProvider();
output = FeatureToTest(input);
SpecialAssert(output);
}
@end
我想要的是:在測試期間,將多次調用testSample1
方法。 每次, SpecialProvider
將發出不同的輸入數據。 與SpecialAssert
相同,可以驗證與給定輸入對應的輸出。
SpecialProvider
和SpecialAssert
將是我控制/所有權下的API(即我編寫它們)。 所述SomeTestSuiteClass
與一起testSample1
將由用戶(即測試寫入器)被寫入。
Objective-C是否可以實現上面的“我想要什么”?
您可以使用Objective-C運行時或某些第三方框架來模擬對象和/或其方法。 我不鼓勵 。 這標志着第一的架構選擇不佳。 方法中的主要問題是直接引用SpecialProvider
和SpecialAssert
符號的代碼中的隱藏依賴項 。 更好的方法是這樣的:
-(void)testSample1:(SpecialProvider*)provider assert:(BOOL (^)(parameterTypes))assertBlock {
input = provider;
output = FeatureToTest(input);
if (assertBlock != nil) {
assertBlock(output);
}
}
由於Objective-c不支持默認參數值(如Swift),因此您可以使用以下方法來模擬它:
-(void)testSample1 {
[self testSample1:DefaultSpecialProvider() assert:DefaultAssert()];
}
不要一直調用顯式-(void)testSample1:(SpecialProvider*)provider assert:(BOOL (^)(parameterTypes))assertBlock
,但是在測試中,您始終使用顯式2參數變量來替換實現( s)不在測試中。
進一步的改進思路:
將SpecialProvider
和SpecialAssert
放在協議后面(即,其他編程語言中的接口等效),以便您可以輕松地交換實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.