2016-02-16 2 views
1

ПРИМЕЧАНИЕ: Это не мой фактический код, я набрал его простым способом, чтобы сюда обратиться за помощью.Mocking Objective-C code in Swift Unit-Tests


Я этот класс написан на Objective-C

@interface MySpecialManager <NSObject> 

+ (MySpecialManager *)sharedInstance; 
-(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo; 
-(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo success:(void (^)(NSString *))success failure:(void (^)(NSError *error))failure; 

@end 

У меня есть юнит-тесты (в Swift) для второй функции с блоками успеха/неудачи, но сейчас я пытаюсь написать блок тесты для первой функции. Вся эта функция выполняет вызов второй функции. Поэтому я думал, что лучший способ проверить это будет просто проверить, что вторая функция действительно вызвана и с правильными параметрами. Поэтому я думал, что насмехаться/стучать - это путь вперед, но я изо всех сил пытаюсь понять, как именно это проверить.

С гораздо погуглить я прочитал, что создание моего собственного Mock объекта будет путем вперед, я это сейчас (написано в Swift):

class MockMySpecialManager: NSObject, MySpecialManagerProtocol { 

var functionOneWasCalled = false 
var functionTwoWasCalled = false 

func someFunctionWithParamOne(paramOne: String!, andParamTwo paramTwo: String!) { 
    functionOneWasCalled = true 
} 

func someFunctionWithParamOne(paramOne: String!, andParamTwo paramTwo: String!, success: ((String!) -> Void)!, failure: ((NSError!) -> Void)!) { 
    functionTwoWasCalled = true 
} 

Если в моем тесте, хотя я Инициализирую MockMySpecialManager и вызывать первый метод, он не будет вызывать второй, поскольку он просто обновляет логическое, правильно? Я мог обновить функцию mock, чтобы вызвать вторую, но это похоже на обман, а не на реальный модульный тест, поскольку он не тестирует мой код. Как я могу проверить это?

Мне как-то (или так я думаю) нужно настроить менеджера на MySpecialManager.sharedInstace(), вызвать первый метод, а затем проверить, был ли мой второй метод вызван на макет.

Любая помощь? Что я не понимаю/где я ошибаюсь?

ответ

1

Ваш текущий класс MOC на самом деле является полной заменой целевого класса, поэтому вы на самом деле его вообще не проверяете.

Если ваш MOC был подклассом целевого класса вместо этого и реализовал только второй метод, тогда тест может вызвать первый метод, и MOC может проверить, вызван ли второй метод.

Часто вы должны использовать насмешливую библиотеку, чтобы помочь с этим, и эти библиотеки позволяют вам по-разному делать то же, что и выше.

В качестве альтернативы вы не должны MOC целевого класса, вы бы MOC все его зависимости. Затем ваш тест проверяет, что зависимости вызываются надлежащим образом и с необходимыми параметрами. Тогда ваш первый и второй тесты метода - это одна и та же настройка, но с немного отличающимися ожиданиями.

+1

Ваш первый комментарий поразил меня привкусом здравого смысла! Я сейчас подклассифицирую и вижу, что это заставляет меня, но я по крайней мере дал вам голос. – Hodson

+0

уверен, помните, что в вашем подклассе вы также можете назвать супер, чтобы вы могли реализовать первый и второй методы, чтобы добавить свою тестовую логику, это не придает большого значения этому тесту, поскольку вы знаете, что звоните 1, но это полезно в MOC вы собираетесь повторно использовать – Wain