Проверьте вызов метода с помощью OCMockito

У меня есть эти два метода в ClassA

-(IBAction)onSubmit;
-(void)validateName:(NSString*)name;

@Реализация

- (IBAction)onSubmit {
    [self validateName:self.textfield.text];
}

-(void)validateName:(NSString*)name{
    // do something
}

Мой тест выглядит следующим образом:

//given
ClassA *classA = mock([ClassA class]);
classA.textfield.text = @"Foo";

// when 
[classA onSubmit];

[verify(classA) validateName:@"Foo"];

Но это не работает, я продолжаю получать:

Expected 1 matching invocation, but received 0

Как я могу написать тест, который проверяет, что validateName выполняется, когда вызывается onSubmit.

1 ответ

Решение

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

Тест внутреннего состояния выглядит так:

Учитывая начальное состояние, если тестируемая система что-то делает, то результирующее состояние должно быть следующим.

Тест внешнего поведения выглядит так:

Если тестируемая система что-то делает, то другой модуль должен делать что-то еще.

Первый вид тестов выполняется со стандартными утверждениями (assertThat() звонки в случае с OCHamcrest). Второй вид тестов (правильно) выполняется с проверкой двойников теста (verify() звонки в случае OCMockito).

Не имеет смысла издеваться над тестируемой системой. Если вы считаете необходимым проверить внутреннее поведение (то есть конкретные методы, вызываемые тестируемой системой), то вам необходимо сопоставить эти поведения с состояниями. В вашем случае это будет означать, что ClassA реализует флаг, такой как BOOL nameValidated (предпочтительно с getter isNameValidated) или переменную, такую ​​как NSString * validatedName.

Другие вопросы по тегам