我如何测试我的NSNumberFormatter只被初始化一次?

时间:2016-01-09 17:00:29

标签: ios objective-c unit-testing cocoa singleton

我为NSDecimalNumber创建了一个类别,我在其中NSString并返回NSDecimalNumber。我在一些视图控制器中使用它,并希望创建一个NSNumberFormatter的全局实例。我认为这有效,但我不知道如何测试它。例如,每次分配NSNumberFormatter实例时,我都想要NSLog。我该怎么做?

#import "NSDecimalNumber+amountFromTextField.h"

@implementation NSDecimalNumber (amountFromTextField)

static NSNumberFormatter *nf;

+(NSDecimalNumber *)amountFromTextField:(NSString *)amount {
    @synchronized(self) {
        if (nf == nil) {
            nf = [[NSNumberFormatter alloc] init];
        }
    }
    NSDecimal _amount = [[nf numberFromString:amount] decimalValue];
    return [NSDecimalNumber decimalNumberWithDecimal:_amount];
}

@end

1 个答案:

答案 0 :(得分:4)

您可以将格式化程序分配提取到另一个方法中,并断言:

+ (NSNumberFormatter*)amountFormatter;

- (void)testOnlyOneFormatterIsCreated {
    NSNumberFormatter *formatter1 = [NSDecimalNumber amountFormatter];
    NSNumberFormatter *formatter2 = [NSDecimalNumber amountFormatter];
    XCTAssertEqual(formatter1, formatter2, "Expected only one formatter to be created");
}

您当前实现的问题是您无法访问创建的格式化程序,因此很难对其进行测试。将对象创建和业务逻辑拆分为单独的单元也有利于您的代码,因为它可以使您的单元保持简短并仅专注于一项任务。