1

我们一直在使用RLMClearRealmCache在测试迁移的测试之间清除 Realm 的状态。如果缓存没有被清除,下一个测试将不会执行迁移,因为缓存仍然报告模式是最新的,即使我们已经删除并替换了领域固定文件(它具有旧模式)。

RLMClearRealmCache最近被移动到一个 Objective-C++ 文件,所以我们想停止使用它并避免在我们的项目中使用 Objective-C++。这仍然是最好/唯一的方法吗?

需要明确的是,我们没有将内存中的领域用于这些规范。我们有一个default.realm在特定版本的设备中保存的夹具文件,我们正在执行以下操作来使用它:

- (void)loadBundledRealmWithName:(NSString *)name;
{
    [self deleteOnDiskRealm];

    // copy over the file to the location
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *source = [[NSBundle bundleForClass:[self class]] pathForResource:name ofType:@"realm"];
    if (documentsDirectory && source) {
        NSString *destination = [documentsDirectory stringByAppendingPathComponent:kDefaultRealmFileName];
        [[NSFileManager defaultManager] copyItemAtPath:source toPath:destination error:nil];
    }
}

但是,在测试用例之间,如果没有调用RLMClearRealmCache,似乎 Realm 的缓存确定迁移已经运行,即使我们已经换出.realm文件并且需要再次运行它们。

4

2 回答 2

2

您可以为每个测试使用单独的内存领域。当您这样做时,每个测试都会获得一个“新鲜的”领域,并且领域的状态不会从一个测试泄漏到另一个测试。

要实现这一点,您只需inMemoryIdentifer在运行之前将 Realm 的配置设置为当前测试的名称。您可以在XCTestCase子类setUp方法中执行此操作(如领域文档中所建议):

override func setUp() {
    super.setUp()
    Realm.Configuration.defaultConfiguration.inMemoryIdentifier = self.name
}

编辑:

这个答案不适合更新后的问题,但无论如何我都会把它留在这里,因为它可能会帮助其他人寻找在测试之间重置 Realm 状态的方法。

于 2016-02-27T22:52:02.450 回答
0

我们最终让 Realm 清除它的缓存,因为它利用了如果不再引用它就会这样做的事实。追踪阻止它这样做的问题有点棘手:我们在测试运行之间保留了对 Realm 对象的引用:

context(@"some context", ^{
    __block MyRealmObject *whoops;

    beforeEach(^{
        [specHelper loadBundledRealmWithName:@"release-50-fixture.realm"];
        [migrationManager performMigrations];
        whoops = [[MyRealmObject allObjects] firstObject];
    });

    it(@"first", ^{
        // migrations will run for this `it`
    });

    it(@"second", ^{
        // migrations will NOT run for this `it` since the old Realm is still around and its cache thinks migrations have already run (even though we've swapped out the backing DB).
        // the issue is that `whoops` is retaining a `MyRealmObject` and thus the Realm.
    });
});
于 2016-03-01T23:51:42.597 回答