在单元测试全局设置期间处理未释放的数据库

时间:2018-03-01 07:13:59

标签: sqlite xamarin nunit-3.0

我正在使用NUnit 3进行全局设置,这会创建一个运行多个服务测试所需的本地数据库,如下所示:

[SetUpFixture]
public class FixtureSetup
{
    private MobileServiceClient _client;
    private SyncService _syncService;

    [OneTimeSetUp]
    public void GlobalSetup()
    {
        _client = Substitute.For<MobileServiceClient>(Settings.SyncUrl);
        _syncService = Substitute.For<SyncService>(_client);
    }

    [OneTimeTearDown]
    public void GlobalTeardown()
    {
        _syncService = null;
        _client.Dispose();
    }
}

Settings.SyncUrl包含Azure应用服务SDK最终同步到的Azure的URL,与此问题无关。

一次性设置,只是构造MobileServiceClient的新实例并将该实例传递给我的SyncService类,以构建本地存储,如下所示:

public class SyncService : ISyncService
{
    private readonly IMobileServiceClient _client;

    private MobileServiceSQLiteStore Store { get; }

    public SyncService(IMobileServiceClient client)
    {
        _client = client;

        Store = new MobileServiceSQLiteStore(Settings.SyncDb);
        Store.DefineTable<User>();

        _client.SyncContext.InitializeAsync(Store);
    }

    public async Task<List<TTable>> All<TTable>()
    {
        var table = await _client.GetSyncTable<TTable>().ToListAsync();
        return table;
    }

    public async Task<TTable> Insert<TTable>(TTable table)
    {
        await _client.GetSyncTable<TTable>().InsertAsync(table);
        return table;
    }

    public async Task<List<TTable>> Search<TTable>(Expression<Func<TTable, bool>> predicate)
    {
        var table = await _client.GetSyncTable<TTable>().Where(predicate).ToListAsync();
        return table;
    }
}

Settings.SyncDb只是指向数据库的名称,名为localstorage.db,如果在移动设备上,将其存储在应用程序的文件存储库中,在Windows或Mac上,它会将其存储在用户的个人资料文件夹。添加此内容仅供参考。

我的问题是全局设置正确地创建了localstorage.db,但是当单元测试运行时,它无法访问localstorage.db,因为它似乎仍然被全局设置方法使用。

我认为在测试类中重新实例化MobileServiceClient会解决这个问题,但似乎并没有这样做。在点击单元测试之前,有没有办法在db上释放句柄?

这不是开发中的问题,因为我可以在第一次失败后再次运行单元测试,但由于这个原因,VSTS构建未通过测试。

提前致谢。

0 个答案:

没有答案