2015-07-14 5 views
0

Я начинаю работу с OSX TDD и OCMock, следуя http://pathfindersoftware.com/2009/01/testing-delegate-ocmock/.Прикладное тестирование OSX с OCMock

Сейчас я на этапе, когда мое приложение отображает логин при запуске и хочет проверить, что пользователь с недопустимыми/учетными данными не может войти в систему.

Подробно, AppDelegate будет выступать в качестве делегата контроллера входа в систему, попытаться войти в систему (без установки учетных данных), затем вызывается метод делегата didNotAuthorizeUser. Однако я получаю ошибку в тесте. Более подробная информация приведена ниже.

Настройка объекта

  • AppDelegate - реальный объект, экземпляр входа ВХ и соответствует его протоколу (SomeDelegateProtocol)
  • LoginVC - издевался
  • Применение - издевался

Test.m

id mocklvc = [OCMockObject mockForClass:[LoginViewController class]]; 

[appDelegate setLoginViewController:mocklvc]; 

id qtApp = [OCMockObject mockForClass:[NSApplication class]]; 

id loginDelegate = [OCMockObject mockForProtocol:@protocol(SomeDelegate)]; 

[[mocklvc expect] setLoginDelegate:loginDelegate]; 
[[mocklvc expect] authenticateWithService]; 
[[loginDelegate expect] didNotAuthorizeUser]; 


//This row returns NSInternalConsistencyException 
//OCMockObject[LoginViewController] 
//unexpected method invoked setLoginDelegate:<AppDelegate> 
[appDelegate applicationDidFinishLaunching:qtApp]; 

[mocklvc verify]; 

AppDelegate.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{   
    [self.loginViewController setLoginDelegate:self]; 
} 

LoginViewController.h/.m

@property (слабый) ID < SomeDelegate> loginDelegate;

Сообщение об ошибке

При вызове didFinishLaunchingWithOptions приложения: Я получаю следующее сообщение об ошибке в тесте,

NSInternalConsistencyException OCMockObject[LoginViewController] unexpected method invoked setLoginDelegate:<AppDelegate>

Как вы думаете, это хорошая установка в первую очередь? Любые идеи о том, как переписать тест или действительно обойти ошибку?

+0

Ошибка, которую вы видите, указывает на то, что либо 'setLoginDelegate:' не получает вызов вообще, либо не вызывается с 'loginDelegate' в качестве аргумента. Это имеет смысл, потому что я не знаю, как ваш делегат приложения узнает о том, что вы создали делегат-делегат входа. Я бы разложил ваш тест на две части - один тест, на который вызывается логин при запуске, а другой - прямое тестирование контроллера входа. Возможно, вам захочется прочитать чужие тесты, чтобы понять, как они должны быть построены. –

+1

Я обменивал аргумент на appDelegate - так как это фактический аргумент, вызываемый в AppDelegate.m. Иногда эти маленькие комментарии действительно направляют один на правильный путь :) спасибо! – Rabiees

ответ

0

Обмен loginDelegate за appDelegate решает проблему.