xunit 构造函数在每次测试之前运行
xunit constructor runs before each test
在测试 class 中,构造函数在每个测试之前启动,构造函数提供的初始化数据无法被后续测试访问。
我希望所有测试都可以访问初始化数据。 (只创建一次)
[Category("Basics")]
[Collection("DD")]
[ExcludeFromCodeCoverage]
public class SecurityTests : TestUnitBase
{
StartUpFixture fixture;
public AuthenticationTests(StartUpFixture fixture)
: base()
{
this.fixture = fixture;
}
[Fact(DisplayName = "Successful response Test1")]
public void SuccessfulResponseTest1()
{
var users = base.Db.Users.FirstOrDefault(x => x.Name == "abc");
...
}
[Fact(DisplayName = "Successful response Test2")]
public void SuccessfulResponseTest2()
{
var users = base.Db.Users.FirstOrDefault(x => x.Name == "xyz");
...
}
提前致谢。
您可以使用 Xunit Class 灯具。当使用 class fixture 时,xUnit.net 将确保在任何测试 运行 之前创建 fixture 实例,并且一旦所有测试完成,它将清理 fixture通过调用 Dispose 对象(如果存在)。例如:
//similar to base class
public class DatabaseFixture : IDisposable
{
public SqlConnection Db { get; private set; }
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// initialize data in the test database
}
public void Dispose()
{
// clean up test data from the database
}
}
//Class where you want to use shared class instance
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture dbFixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.dbFixture = fixture;
}
// write tests, using dbFixture.Db to get access to the SQL Server
}
对于每个测试,它将创建一个新的 MyDatabaseTests 实例,并将 DatabaseFixture 的共享实例传递给构造函数。
Xunit 文档 here。
希望对您有所帮助。
编辑 28/10
对于多个灯具,您可以创建一个 class 来封装其他两个灯具,如下所示,并在 db 灯具之前创建 运行 的启动灯具:
public class SecurityTestsFixture : IDisposable
{
public DatabaseFixture Dbfixture { get; private set; }
public StartupTestFixture Startupfixture { get; private set; }
public SecurityTestsFixture()
{
Startupfixture = new StartupTestFixture();
Dbfixture = new DatabaseFixture(Startupfixture);
}
public void Dispose()
{
// clean up code
Dbfixture.Dispose();
}
public class StartupTestFixture
{
public string SqlConnString { get; private set; }
public StartupTestFixture()
{
SqlConnString = ConfigurationManager.AppSettings["SqlConnectionString"];
// other startup code
}
}
public class DatabaseFixture : IDisposable
{
public SqlConnection Db { get; private set; }
public DatabaseFixture(StartupTestFixture sFixture)
{
Db = new SqlConnection(sFixture.SqlConnString);
// initialize data in the test database
}
public void Dispose()
{
// clean up test data from the database
}
}
}
并测试 class:
public class Xunittests : IClassFixture<SecurityTestsFixture>
{
SecurityTestsFixture _securityFixture;
public Xunittests(SecurityTestsFixture securityfixture)
{
_securityFixture = securityfixture;
}
[Fact(DisplayName = "Successful response Test1")]
public void SuccessfulResponseTest1()
{
var db = _securityFixture.Dbfixture.Db;
//var users = db.Users.FirstOrDefault(x => x.Name == "...");
Assert.Equal("test", "test");
}
}
在测试 class 中,构造函数在每个测试之前启动,构造函数提供的初始化数据无法被后续测试访问。
我希望所有测试都可以访问初始化数据。 (只创建一次)
[Category("Basics")]
[Collection("DD")]
[ExcludeFromCodeCoverage]
public class SecurityTests : TestUnitBase
{
StartUpFixture fixture;
public AuthenticationTests(StartUpFixture fixture)
: base()
{
this.fixture = fixture;
}
[Fact(DisplayName = "Successful response Test1")]
public void SuccessfulResponseTest1()
{
var users = base.Db.Users.FirstOrDefault(x => x.Name == "abc");
...
}
[Fact(DisplayName = "Successful response Test2")]
public void SuccessfulResponseTest2()
{
var users = base.Db.Users.FirstOrDefault(x => x.Name == "xyz");
...
}
提前致谢。
您可以使用 Xunit Class 灯具。当使用 class fixture 时,xUnit.net 将确保在任何测试 运行 之前创建 fixture 实例,并且一旦所有测试完成,它将清理 fixture通过调用 Dispose 对象(如果存在)。例如:
//similar to base class
public class DatabaseFixture : IDisposable
{
public SqlConnection Db { get; private set; }
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// initialize data in the test database
}
public void Dispose()
{
// clean up test data from the database
}
}
//Class where you want to use shared class instance
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture dbFixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.dbFixture = fixture;
}
// write tests, using dbFixture.Db to get access to the SQL Server
}
对于每个测试,它将创建一个新的 MyDatabaseTests 实例,并将 DatabaseFixture 的共享实例传递给构造函数。
Xunit 文档 here。
希望对您有所帮助。
编辑 28/10 对于多个灯具,您可以创建一个 class 来封装其他两个灯具,如下所示,并在 db 灯具之前创建 运行 的启动灯具:
public class SecurityTestsFixture : IDisposable
{
public DatabaseFixture Dbfixture { get; private set; }
public StartupTestFixture Startupfixture { get; private set; }
public SecurityTestsFixture()
{
Startupfixture = new StartupTestFixture();
Dbfixture = new DatabaseFixture(Startupfixture);
}
public void Dispose()
{
// clean up code
Dbfixture.Dispose();
}
public class StartupTestFixture
{
public string SqlConnString { get; private set; }
public StartupTestFixture()
{
SqlConnString = ConfigurationManager.AppSettings["SqlConnectionString"];
// other startup code
}
}
public class DatabaseFixture : IDisposable
{
public SqlConnection Db { get; private set; }
public DatabaseFixture(StartupTestFixture sFixture)
{
Db = new SqlConnection(sFixture.SqlConnString);
// initialize data in the test database
}
public void Dispose()
{
// clean up test data from the database
}
}
}
并测试 class:
public class Xunittests : IClassFixture<SecurityTestsFixture>
{
SecurityTestsFixture _securityFixture;
public Xunittests(SecurityTestsFixture securityfixture)
{
_securityFixture = securityfixture;
}
[Fact(DisplayName = "Successful response Test1")]
public void SuccessfulResponseTest1()
{
var db = _securityFixture.Dbfixture.Db;
//var users = db.Users.FirstOrDefault(x => x.Name == "...");
Assert.Equal("test", "test");
}
}