Я начинаю работу с 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>
Как вы думаете, это хорошая установка в первую очередь? Любые идеи о том, как переписать тест или действительно обойти ошибку?
Ошибка, которую вы видите, указывает на то, что либо 'setLoginDelegate:' не получает вызов вообще, либо не вызывается с 'loginDelegate' в качестве аргумента. Это имеет смысл, потому что я не знаю, как ваш делегат приложения узнает о том, что вы создали делегат-делегат входа. Я бы разложил ваш тест на две части - один тест, на который вызывается логин при запуске, а другой - прямое тестирование контроллера входа. Возможно, вам захочется прочитать чужие тесты, чтобы понять, как они должны быть построены. –
Я обменивал аргумент на appDelegate - так как это фактический аргумент, вызываемый в AppDelegate.m. Иногда эти маленькие комментарии действительно направляют один на правильный путь :) спасибо! – Rabiees