#iphone #ios #unit-testing #bdd #kiwi
#iPhone #iOS #Модульное тестирование #bdd #Kiwi
Вопрос:
У меня есть приложение, для которого я использую Objective Resource для создания локальных объектов для отражения удаленных ответов.
Конкретные классы моделей имеют подкласс абстрактного класса, чтобы предоставить им множество дополнительных функций, что наиболее важно, возможность сериализации, записи на диск и загрузки с диска, независимо от того, каковы конкретные свойства этого конкретного объекта модели.
superclass.m
-(BOOL)saveToDisk{
...serializes and encodes all properties to disk
...return success
}
subclass.h : superclass
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSArray* friends;
...etc
Тогда я бы назвал
instanceOfSubclass.name = "joe"
NSLog(@"save status = %d",[instanceOfSubclass saveToDisk]);
Я новичок в BDD и разработке на основе тестирования в целом. Как мне создать макет объекта, используя kiwi, чтобы абстрактно протестировать эту функциональность, поскольку я использую этот фреймворк во многих проектах.
В частности, я хочу создать тесты, которые гарантируют, что подкласс с различными типами свойств может быть сохранен, загружен, удален и перезаписан.
Я понимаю, что именно здесь появляются заглушки и макеты, но, похоже, я не могу понять, как имитировать свойства. Должен ли я создавать реальный класс с этими свойствами?
Ответ №1:
Свойства — это методы за кулисами, поэтому:
Мне удалось сделать это с помощью комбинации mock
метода, упомянутого в @aopsfan
, затем, используя -stub:andReturn:
, я догадался по названию методов, которые реализовали свойства. Этот пример сработал, олицетворяя TCConnection (из Twilio iOS SDK):
// Instantiates a mocked object:
id fake_connection = [TCConnection mock];
// Creates a faked property accessor:
[fake_connection stub:@selector(parameters)
andReturn:@{@"From": @"fake-caller"}];
// I could now call my TCDeviceDelegate 's
// -device:didReceiveIncomingConnection:
[myActualObject device:myActualObject.device
didReceiveIncomingConnection:fake_connection];
// Check some results on the object:
[[myActualObject.connection should] equal:fake_connection];
Этот конкретный пример шаблона, вероятно, можно обобщить на другие ситуации. Полезно вызывать -stub
(без параметра andReturn:
), чтобы отключить методы, которые нельзя вызвать в моделируемом устройстве.
Ответ №2:
В этом месте есть некоторая документация для вас. По сути, Kiwi предоставляет категорию Objective-C, к NSObject
которой у вас есть доступ, когда вы #import "Kiwi.h"
. Это позволяет всем объектам, которые наследуют от NSObject
, отвечать на mock
, mockWithName:
, и т.д., Что настраивается KWMock
с помощью класса.
Надеюсь, это поможет, и извините, что немного поздно 🙂
Комментарии:
1. ссылка на документы не работает, попробуйте GitHub: github.com/kiwi-bdd/Kiwi/wiki/Mocks-and-Stubs