我刚开始进行单元测试,并且正在使用 xUnit 框架。我有一个 AbstractTest 类,它定义了一些我将在每个测试类中使用的抽象测试方法。 问题出在静态字段 - InsertData。在这种情况下,MemberData InsertData 必须是静态的。我无法为继承类 (TestClass) 中的 InsertData 分配一些值,因为在调试器接触两个构造函数之前我得到了错误。
public abstract class AbstractTest<TModel> where TModel : class
{
public IRepository<TModel> repo;
public static IEnumerable<object[]> InsertData;
[Theory]
[MemberData(nameof(InsertData))]
public virtual void AbsTestInsert(TModel model)
{
try
{
repo.AddUpdate(model);
Assert.True(true);
}
catch (Exception ex)
{
Assert.True(false, ex.Message);
}
}
}
public class TestClass : AbstractTest<TestModel>
{
public TestClass()
{
repo = TestRepository();
}
}
因为我继承了 AbstractTest 类,所以我将进行测试。
我找不到使 InsertData 保持静态但在继承类中覆盖其值的解决方案。
我有这样的想法:
public static IEnumerable<object[]> InsertData() => Data;
public abstract/virtual IEnumerable<object[]> Data()
{
return ...;
}
但是要做到这一点数据也必须是静态的...
最佳答案
理论数据来自静态源的要求是一项硬性要求,没有解决方法。但是,根本不需要在抽象类上定义数据。你可以这样做:
public abstract class AbstractTest<TModel> where TModel : class
{
public IRepository<TModel> repo;
[Theory]
[MemberData("InsertData")]
public virtual void AbsTestInsert(TModel model)
{
try
{
repo.AddUpdate(model);
Assert.True(true);
}
catch (Exception ex)
{
Assert.True(false, ex.Message);
}
}
}
public class TestClass : AbstractTest<TestModel>
{
public static IEnumerable<object[]> InsertData;
public TestClass()
{
repo = TestRepository();
}
}
您在每个实现类上使用相同的名称定义数据。它不是虚拟的/抽象的,它只是按名称排列事物。
关于c# - 具有带参数的虚拟测试方法的 xUnit 抽象测试类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55004351/