Проверьте вызов метода с помощью 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.