2015-12-11 3 views
0

Этот мой код ниже. Я хочу использовать модульное тестирование для этого файла. Я хочу знать, если это возможно для модульного тестирования в XCTest этого кодПроблемы с кодеком NSCoder

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface Presenter : NSObject 
@property (nonatomic, retain) NSString *Name; 
@property (nonatomic, retain) NSString *Topic; 
@property (nonatomic, retain) NSString *Date; 
@property (nonatomic, retain) NSString *Time; 
@property (nonatomic, retain) NSString *Location; 
@property (nonatomic, retain) UIImage *image; 
@property (nonatomic, retain) NSMutableDictionary *rattings; 
@property (nonatomic, assign) BOOL isLiked; 



@end 

Этих М-файл:

#import "Presenter.h" 

@implementation Presenter 

- (id) initWithCoder: (NSCoder *)coder 
{ 
    if (self = [super init]) 
    { 
     self.Name = [coder decodeObjectForKey:@"Name"]; 
     self.Topic = [coder decodeObjectForKey:@"Topic"]; 
     self.Date = [coder decodeObjectForKey:@"Date"]; 
     self.Time = [coder decodeObjectForKey:@"Time"]; 
     self.Location = [coder decodeObjectForKey:@"Location"]; 
     self.image = [coder decodeObjectForKey:@"image"]; 
     self.rattings = [coder decodeObjectForKey:@"rattings"]; 
     self.isLiked = [coder decodeBoolForKey:@"isLiked"]; 

    } 

    return self; 


} 

- (void) encodeWithCoder: (NSCoder *)coder 
{ 
    [coder encodeObject: self.Name forKey:@"Name"]; 
    [coder encodeObject: self.Topic forKey:@"Topic"]; 
    [coder encodeObject: self.Date forKey:@"Date"]; 
    [coder encodeObject: self.Time forKey:@"Time"]; 
    [coder encodeObject: self.Location forKey:@"Location"]; 
    [coder encodeObject: self.image forKey:@"image"]; 
    [coder encodeObject: self.rattings forKey:@"rattings"]; 
    [coder encodeBool: self.isLiked forKey:@"isLiked"]; 

} 


@end 

Я нашел это о модульном тестировании NSCoder

How to unit test NSCoding?

и попытался применить его, но моя попытка на это выдает эту ошибку: поймал «NSInvalidArgumentException», «- [__ NSCFConstantString countByEnumeratingWithState: objects: count:]: unrecognized selecto г

- (void)testName { 
    NSLog(@"%@ start", self.name); // self.name is the name of the test-case method. 
    NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:(NSMutableData *)presenter]; 
    [archive encodeObject:presenter forKey:@"Name"]; 
    for (NSString *Name in presenter.Name) { 
     [archive encodeObject:[presenter valueForKey:Name] forKey:@"Name"]; 
    } 
    XCTAssertTrue([[presenter Name] isEqualToString:@"Name"], "Name"); 
    NSLog(@"%@ end", self.name); 
} 
+0

Почему вы неправильно литья 'presenter' для' NSMutableData'? Почему у вас есть цикл 'for' на одном' NSString'? – rmaddy

+0

BTW - самые бесполезные слова, которые может использовать программист, это «он не работает». Пожалуйста, четко объясните, каким образом код не делает то, что вы ожидаете. Вы получаете предупреждения или ошибки компилятора? Создается ли приложение, но происходит сбой? Он работает, но делает что-то другое, чем ожидалось? Для любого из них дайте четкие, конкретные сведения о проблеме. – rmaddy

+0

Извините, но это то, что я получаю при запуске тестового примера: Тип выражения коллекции «NSString *» может не отвечать на «countByEnumeratingWithState: objects: count: – Walee

ответ

0

Вы должны действительно начать с reading the documentation, чтобы узнать, как использовать NSKeyedArchiver и NSKeyedUnarchiver.

Вот как ваш метод должен выглядеть следующим образом:

- (void)testName 
{ 
    NSLog(@"%@ start", self.name); // self.name is the name of the test-case method. 

    Presenter *presenter = [[Presenter alloc] init]; 
    presenter.Name = @"John"; 
    NSMutableData *presenterData = [NSMutableData data]; 

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:presenterData]; 
    [archiver encodeObject:presenter forKey:@"presenter"]; 
    [archiver finishEncoding]; 

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:presenterData]; 
    Presenter *decodedPresenter = [unarchiver decodeObjectForKey:@"presenter"]; 
    [unarchiver finishDecoding]; 

    XCTAssertTrue([decodedPresenter.Name isEqualToString:presenter.Name], "Name"); 

    NSLog(@"%@ end", self.name); 
} 

Но вы могли бы сделать это в гораздо более простым способом с фабричными методами:

- (void)testName 
{ 
    NSLog(@"%@ start", self.name); // self.name is the name of the test-case method. 

    Presenter *presenter = [[Presenter alloc] init]; 
    presenter.Name = @"John"; 

    NSData *presenterData = [NSKeyedArchiver archivedDataWithRootObject:presenter]; 
    Presenter *decodedPresenter = [NSKeyedUnarchiver unarchiveObjectWithData:presenterData]; 

    XCTAssertTrue([decodedPresenter.Name isEqualToString:presenter.Name], "Name"); 

    NSLog(@"%@ end", self.name); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^