簡體   English   中英

用於objective-c的“ python函數修飾器”以更改方法的行為

[英]“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相同,可以驗證與給定輸入對應的輸出。

SpecialProviderSpecialAssert將是我控制/所有權下的API(即我編寫它們)。 所述SomeTestSuiteClass與一起testSample1將由用戶(即測試寫入器)被寫入。

Objective-C是否可以實現上面的“我想要什么”?

您可以使用Objective-C運行時或某些第三方框架來模擬對象和/或其方法。 不鼓勵 這標志着第一的架構選擇不佳。 方法中的主要問題是直接引用SpecialProviderSpecialAssert符號的代碼中的隱藏依賴項 更好的方法是這樣的:

-(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)不在測試中。

進一步的改進思路:
SpecialProviderSpecialAssert放在協議后面(即,其他編程語言中的接口等效),以便您可以輕松地交換實現。

暫無
暫無

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

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