2015-03-06 2 views
4

В настоящее время я использую Swift.Как установить метод тестирования, который вызывает NSDate()?

Мой вопрос прост, как вы можете протестировать метод, который создает объект в базе данных с NSDate() как свойство?

Проблема заключается в том, что на моем утверждают я создам новый NSDate(), как это:

let expectedObject = Object(data: NSDate()) 
XCTAssertEqual(database.objects(), [expectedObject]) 

И утверждают, потерпит неудачу, потому что 2 NSDates немного отличаются.

спасибо.

+1

как насчет обрыва всех вызовов nsdate? – Jan

+0

Как это сделать? –

+0

с киви было бы зовком как [[dateObject should] получать: @selector (currentGear) иReturn: theValue (3)]; есть разные смешные рамки, или вы можете использовать метод swizzling – Jan

ответ

0

Один простой обходной путь может быть использовать следующий подход:

  1. Создать макет класс, производный от класса испытуемый.
  2. Добавьте метод «getDate() -> NSDate» в тестируемый класс, который возвращает «NSDate()» - или любое другое значение.
  3. Заменить getDate() в mockClass. Вы также можете создать переменную в mock класс, который возвращается из getDate(). При этом вы сможете использовать , чтобы указать, какую дату вы хотите пройти.
  4. Наконец, вместо создания экземпляра класса, который вы хотите протестировать, создайте экземпляр класса mock в вашем тесте .
+1

Это действительно плохое решение, мне не нужно было менять свой класс, чтобы проверить его. –

+0

@RodrigoRuiz он не говорит, чтобы изменить свой класс - он говорит, чтобы создать тестируемый класс. Смысл - единственный способ эффективно протестировать. – jungledev

+0

Mocks предназначены для замены зависимостей, а не для замены класса, который вы хотите проверить. Таким образом, вы не тестируете свой класс, вы тестируете макет. –

0

Как указано в https://testdriven-ios.com

очень хороший подход, чтобы переопределить NSDate.date в тесте заставляя его вернуться известной датой

@implementation NSDate (custom) 

+ (instancetype)date{ 
    NSDateFormatter* formatter = NSDateFormatter.new; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZZZ"]; 
    return [formatter dateFromString:@"2017-12-28 13:00:10+0000"]; 
} 

@end 

Тогда везде, где NSDate.date называется, то 2017-12-28 13:00:10+0000 будет возвращен

@implementation NSDate (custom) 

+ (instancetype)date{ 
    NSDateFormatter* formatter = NSDateFormatter.new; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZZZ"]; 
    return [formatter dateFromString:theDate]; 
} 

@end 

вы даже можете настроить его Furt ее, используя статическую переменную date, а затем внесите изменения в тест

-(void) test_something_out { 
theDate = @"2017-12-28 13:00:10+0000"; 
//Test any function that uses nsdate.date 
} 
Смежные вопросы