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

Posted

技术标签:

【中文标题】如何测试我的 NSNumberFormatter 只初始化一次?【英文标题】:How do I test that my NSNumberFormatter is only initialized once? 【发布时间】:2016-01-09 17:00:28 【问题描述】:

我为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

【问题讨论】:

使用一次调度。这样,数字格式化程序将只初始化一次。 ***.com/q/5720029/3882338 不过,这仍需要测试。 【参考方案1】:

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

+ (NSNumberFormatter*)amountFormatter;

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

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

【讨论】:

以上是关于如何测试我的 NSNumberFormatter 只初始化一次?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 NSNumberFormatter 对象为输入 1.0 打印“2”?

NSNumberFormatter 货币符号

使用 NSNumberFormatter 将数字转换为格式

NSNumberFormatter numberFromString 为货币样式格式化程序返回 0

货币格式的 NSNumberFormatter.number 在设备中不起作用但在模拟器中起作用

NSNumberFormatter 千位分隔符和尾随零