【发布时间】:2021-09-08 02:54:31
【问题描述】:
我正在使用xUnit.net 测试框架,并且在每个单元测试中我都有一些我在每种情况下都在执行的步骤。我想知道是否有一种方法可以在我的单元案例开始之前调用此方法一次,并在所有单元测试案例都已执行时调用。
例如:在下面的场景中,我有两个单元案例,在每个案例中,我都创建了一个本地数据库,用数据填充它,然后运行我的测试,一旦完成,我就会调用方法来删除数据库。我在每个测试用例中都这样做。而不是多次创建,我想创建一次并填充一次,然后在执行所有测试用例后删除 db。删除我创建的内容对我来说很重要,因为如果在执行测试时未创建数据库,测试用例中的某些情况将失败。
[Fact]
public void UnitCase1()
{
CreateDb();
UploadData();
...//My set of operation to test this case
...//Assert
DeleteDb()
}
[Fact]
public void UnitCase2()
{
CreateDb();
UploadData();
...//My set of operation to test this case
...//Assert
DeleteDb()
}
在 Eric 回答后编辑:(我试过但它不起作用)
public class CosmosDataFixture : IDisposable
{
public static readonly string CosmosEndpoint = "https://localhost:8081";
public static readonly string EmulatorKey = "Mykey";
public static readonly string DatabaseId = "Databasename";
public static readonly string RecordingCollection = "collectionName";
string Root = Directory.GetParent( Directory.GetCurrentDirectory() ).Parent.Parent.FullName;
DocumentClient client = null;
public void ReadAllData( DocumentClient client )
{
//reading document code
}
public void ReadConfigAsync()
{
client = new DocumentClient( new Uri( CosmosEndpoint ), EmulatorKey,
new ConnectionPolicy
{
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp
} );
}
public void CreateDatabase()
{// create db code
}
private void DeleteDatabase()
{
// delete db code
}
public CosmosDataFixture()
{
ReadConfigAsync();
CreateDatabase();
ReadAllData( client );
}
public void Dispose()
{
DeleteDatabase();
}
}
public class CosmosDataTests : IClassFixture<CosmosDataFixture>
{
CosmosDataFixture fixture;
public CosmosDataTests( CosmosDataFixture fixture )
{
this.fixture = fixture;
}
[Fact]
public async Task CheckDatabaseandCollectionCreation()
{
List<string> collectionName = new List<string>();
var uri = UriFactory.CreateDatabaseUri(DatabaseId);// don't get DatabaseId or client says does not exist in current context
var collections = await client.ReadDocumentCollectionFeedAsync( uri );
foreach( var collection in collections )
{
collectionName.Add( collection.Id);
}
}
【问题讨论】:
-
如果您正在修改数据库以运行单元测试,那么您正在运行的不是单元测试。模拟你的数据库。
-
你有没有看过 xunit 的文档? xunit.net/docs/comparisons
-
@gunr2171 在某些时候您需要测试数据库交互代码,如果没有真正的数据库就无法测试它。模拟对于测试调用数据访问代码的代码很有用,这里显然不相关。不是“技术上”的单元测试,而是集成测试,一种对现实生活没有影响的学术区别。
-
@gunr2171 如果您听说过 azure 中的 cosmos db,我们有来自 Microsoft cosmos db 模拟器的本地 db 支持,我在这里使用它来使用虚拟数据运行我的测试用例。它在在没有真实数据库的情况下测试行为。现在回到我原来的问题,有没有办法?由于我对编写单元测试用例非常陌生,因此任何小的代码示例都会有所帮助
-
这里对单元测试和集成测试有一些误解。
标签: c# .net unit-testing tdd xunit