You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为单个单元测试类修改Locale(区域设置)

仅为特定单元测试类修改区域设置的解决方案

问题根源

你之前用extension NSLocale重写currentLocale的方式是全局生效的,一旦编译后所有测试用例都会使用这个自定义的区域设置,而且无法在多个测试类中重复定义该扩展,导致冲突。

正确解决方案:利用测试生命周期临时切换

每个测试类可以在setUp方法中保存原始区域设置,切换到目标区域;在tearDown方法中恢复原始设置,这样就能保证区域设置仅对当前测试类生效,不会干扰其他测试。

Swift 实现示例

逗号小数分隔符测试类

import XCTest
import Foundation

class CommaDecimalSeparatorTests: XCTestCase {
    private var originalLocale: Locale!

    override func setUp() {
        super.setUp()
        // 保存原始区域设置
        originalLocale = Locale.current
        // 切换到使用逗号作为小数分隔符的区域(例如土耳其)
        Locale.current = Locale(identifier: "tr_TR")
    }

    override func tearDown() {
        // 恢复原始区域设置
        Locale.current = originalLocale
        super.tearDown()
    }

    // 测试用例示例
    func testDecimalCalculationWithComma() {
        let testString = "123,45"
        let formatter = NumberFormatter()
        formatter.locale = Locale.current
        
        guard let number = formatter.number(from: testString) else {
            XCTFail("Failed to parse number with comma separator")
            return
        }
        XCTAssertEqual(number.doubleValue, 123.45)
    }
}

句点小数分隔符测试类

import XCTest
import Foundation

class PeriodDecimalSeparatorTests: XCTestCase {
    private var originalLocale: Locale!

    override func setUp() {
        super.setUp()
        originalLocale = Locale.current
        // 切换到使用句点作为小数分隔符的区域(例如美国)
        Locale.current = Locale(identifier: "en_US")
    }

    override func tearDown() {
        Locale.current = originalLocale
        super.tearDown()
    }

    func testDecimalCalculationWithPeriod() {
        let testString = "123.45"
        let formatter = NumberFormatter()
        formatter.locale = Locale.current
        
        guard let number = formatter.number(from: testString) else {
            XCTFail("Failed to parse number with period separator")
            return
        }
        XCTAssertEqual(number.doubleValue, 123.45)
    }
}

Objective-C 实现示例

逗号小数分隔符测试类

#import <XCTest/XCTest.h>

@interface CommaDecimalSeparatorTests : XCTestCase
@property (nonatomic, strong) NSLocale *originalLocale;
@end

@implementation CommaDecimalSeparatorTests

- (void)setUp {
    [super setUp];
    self.originalLocale = [NSLocale currentLocale];
    // 切换到土耳其区域
    [NSLocale setCurrentLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"tr_TR"]];
}

- (void)tearDown {
    [NSLocale setCurrentLocale:self.originalLocale];
    [super tearDown];
}

- (void)testDecimalCalculationWithComma {
    NSString *testString = @"123,45";
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.locale = [NSLocale currentLocale];
    
    NSNumber *number = [formatter numberFromString:testString];
    XCTAssertEqual([number doubleValue], 123.45);
}

@end

关键说明

  • setUp会在每个测试用例执行前调用,确保每次测试都能拿到正确的区域设置
  • tearDown会在每个测试用例执行后恢复原始设置,避免影响后续测试类的运行
  • 选择的区域标识符要确保确实使用目标小数分隔符(比如tr_TR用逗号,en_US用句点)

内容的提问来源于stack exchange,提问作者Aisha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:34