Цель C - модульное тестирование и проверка объектов? - PullRequest
12 голосов
/ 29 марта 2011

Как вы тестируете код Objective C?(iPhone)

На других языках, таких как java и .Net, вы можете использовать Dependency Injection, чтобы иметь возможность проводить модульное тестирование и передавать макетированный объект в ваш текущий код.Однако я не смог найти надежную структуру внедрения зависимостей для цели 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();
}

Ответы [ 3 ]

11 голосов
/ 30 марта 2011

Инверсия контроля все еще возможна в объективе-c. Вы, конечно, можете проектировать свои классы с учетом внедрения зависимостей на основе конструктора или свойств, но я не думаю, что вы найдете среду внедрения зависимостей на основе аннотаций, к которой вы привыкли.

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

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

Я видел несколько разных подходов к построению структур внедрения зависимостей для target-c, включая https://github.com/mivasi/Objective-IOC, но я не могу комментировать их зрелость или полезность.

Для насмешек и заглушения объектов смотрите OCMock .

7 голосов
/ 30 марта 2011

как вы можете издеваться над 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];
}

Использование, как уже упоминалось в ответе @ Джоны, превосходного OCMock .Не пытайтесь делать инъекцию зависимостей капитала-D, капитала-I в obj-c, это больше работы, чем стоит.

1 голос
/ 15 апреля 2013

Вот структура внедрения зависимостей для Objective C: http://www.typhoonframework.org

Помимо рассмотрения аспектов проектирования DI, он уделяет большое внимание возможности конфигурировать компоненты для сценариев производства и тестирования (интеграционное тестирование). Это включает в себя:

  • Возможность вводить значения, представленные в виде строк - они преобразуются в требуемый тип во время выполнения.
  • Управление конфигурацией через внешний файл свойств.
  • Асинхронное выполнение теста - позволяет тестировать методы, работающие в фоновом потоке.
...