我正在使用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构建未通过测试。
提前致谢。