Есть ли способ проверить переменную экземпляра в объекте c? - PullRequest
0 голосов
/ 29 мая 2020

Мне нужно проверить переменную экземпляра в Objective C.

У меня есть этот фрагмент в myViewController.m

@implementation myViewController
{
NSView *myView;
}

Мне нужно добавить тест в myViewControllerTest.mm, который проверяет случай, когда myView.window оказывается nil

-(void) myTest 
{
// 1. assert condition 1 is true
// 2. mock myView.window and set it to nil OR set myView.window directly to nil
// 3. assert condition 1 is false
}

. Я хотел бы знать, как лучше всего выполнить шаг 2 в тесте. Подходы, которые я пробовал:

  • Добавить явный установщик - (void)setMyView:(NSView*)myView только для целей модульного тестирования и использовать его в myTest. У меня такое ощущение, что это не лучший способ.
  • сделать myView как свойство и поместить его в myViewController.h, чтобы у меня был сеттер без его явного определения.
  • Неудачная попытка насмешки с использованием OCMock. (необходимо дальнейшее изучение)

Пожалуйста, предложите лучший подход и каковы его плюсы и минусы. Спасибо!

Изменить: ответ, который я использовал в своем тестовом файле.

[myViewController setValue:nil forKeyPath:@"myViewControl.window"];

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/BasicPrinciples.html# // apple_ref / doc / uid / 20002170-BAJEAIEE

1 Ответ

2 голосов
/ 29 мая 2020

Вы можете добавить установщик только для тестирования в свой тестовый файл myViewControllerTest.mm

Это не влияет на ваш производственный код.

как показано ниже, используя расширение

// Write this in test file.
@interface MyViewController(Test)
- (void)setMyView:(NSView *)myView;
@end

или просто используйте valueForKey:, чтобы получить приватное поле.

-(void) myTest 
{
  id myViewController = ...;
  NSView *myView = [myViewController valueForKey:@"myView"];
  myView.window = nil;
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...