簡體   English   中英

目標C - 單元測試和模擬對象?

[英]Objective C - Unit Testing & Mocking Objects?

你如何單元測試Objective C代碼? (蘋果手機)

在其他語言(如java和.Net)中,您可以使用依賴注入,以便能夠在當前代碼中進行單元測試並傳遞模擬對象。 但是,我找不到一個可靠的目標c依賴注入框架。

假設你想為下面的代碼編寫一個單元測試,你怎么能模擬MyObject?

- (void) methodToBeTested
{
     NSString str = @"myString";
     MyObject object = [[MyObject alloc] init];
     [object setString:str];
     [object doStuff];
     [object release];
}

這就是我如何通過依賴注入來做到這一點。 是否有類似的方法來實現目標c?

@Inject MyObject object;

public void methodToBeTested()
{
     String str = "myString";
     // object is automatically instantiated (Dependency Injection)
     object.setString(str);
     object.doStuff();
}

在目標c中,控制反轉仍然是可行的。 您當然可以設計基於構造函數或基於屬性的依賴注入的類,但我認為您不會像以前那樣找到基於注釋的依賴注入框架。

[[ClassToBeTested alloc] initWithDependency:foo andOtherDepedency:bar];

ClassToBeTested *objectUnderTest = [[ClassToBeTested alloc] init];
objectUnderTest.dependency = foo;
objectUnderTest.otherDependency = bar;

我已經看到了為objective-c構建依賴注入框架的幾種不同方法,包括https://github.com/mivasi/Objective-IOC,但我不能評論它們的成熟度或實用性。

對於對象模擬和存根,請查看OCMock

你怎么能模仿MyObject?

- (void) methodToBeTestedWithObject:(MyObject *)object
{
     NSString str = @"myString";
     [object setString:str];
     [object doStuff];
}

去測試:

- (void)testMethodToBeTested {
    id mockMyObject = [OCMock mockForClass:[MyObject class]];

    [[mockMyObject expect] setString:[OCMock any]];
    [[mockMyObject expect] doStuff];

    [objectToTest methodToBeTestedWithObject:mockMyObject];
    [mockMyObject verify];
}

正如@Jonah的回答中提到的那樣,使用優秀的OCMock 不要費心去做資本-D,資本-I Dependency Injection in obj-c,它的工作量超過了它的價值。

這是Objective-C的依賴注入框架: http//www.typhoonframework.org

除了解決DI的設計方面外,它還非常注重能夠為生產與測試場景(集成測試)配置組件。 這包括:

  • 能夠注入表示為字符串的值 - 這些值在運行時轉換為所需的類型。
  • 通過外部屬性文件進行配置管理。
  • 異步測試執行 - 允許您測試在后台線程上運行的方法。

暫無
暫無

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

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