【发布时间】:2018-06-05 20:59:43
【问题描述】:
我有以下DatabaseFixture,它适用于我迄今为止创建的所有测试。我使用这个夹具进行集成测试,这样我就可以对数据库模式结构做出真正的断言。
public class DatabaseFixture : IDisposable
{
public IDbConnection Connection => _connection.Value;
private readonly Lazy<IDbConnection> _connection;
public DatabaseFixture()
{
var environment = Environment.GetEnvironmentVariable("ASPNET_ENVIRONMENT") ?? "Development";
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("AppSettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"AppSettings.{environment}.json", optional: true, reloadOnChange: true)
.Build();
_connection = new Lazy<IDbConnection>(() =>
{
var connection = new MySqlConnection(configuration["ConnectionStrings:MyDatabase"]);
connection.Open();
return connection;
});
}
public void Dispose()
{
Connection?.Dispose();
}
}
[CollectionDefinition("Database Connection Required")]
public class DatabaseConnectionFixtureCollection : ICollectionFixture<DatabaseFixture>
{
}
我现在面临的问题是我现在需要对数据库中表中的每条记录调用类似MyDataIsAccurate(...) 的测试方法。 xUnit 提供了[MemberData] 属性,这正是我所需要的,但它需要一组静态可枚举数据。 xUnit 是否提供了一种干净的方式来静态共享我的DatabaseFixture 连接实例,还是我只需要吸收它并公开同一连接实例的静态变量?
[Collection("Database Connection Required")]
public class MyTests
{
protected DatabaseFixture Database { get; }
// ERROR: Can't access instance of DatabaseFixture from static context...
public static IEnumerable<object[]> MyData => Database.Connection.Query("SELECT * FROM table).ToList();
public MyTests(DatabaseFixture databaseFixture)
{
Database = databaseFixture;
}
[Theory]
[IntegrationTest]
[MemberData(nameof(MyData))]
public void MyDataIsAccurate(int value1, string value2, string value3)
{
// Assert some stuff about the data...
}
}
【问题讨论】:
-
您可能需要类或集合装置。请参阅xunit.github.io/docs/shared-context.html 了解更多信息。
-
忘记复制它,但是(上面编辑过)但我现在已经在使用集合装置,如上图所示。问题是夹具是一个实例,我的测试类上的 MemberData 属性需要一个静态变量。我可以将我的 DatabaseFixture 内部的连接变成静态的,但我希望 xUnit 有一些东西会比诉诸于此更优雅。
标签: c# unit-testing xunit xunit.net