c# - 具有带参数的虚拟测试方法的 xUnit 抽象测试类

标签 c# unit-testing asp.net-core xunit

我刚开始进行单元测试,并且正在使用 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 类,所以我将进行测试。 Test class

我找不到使 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/

相关文章:

c# - 如果为 null,则 Eval() 显示自定义值

c++ - 单元测试需要很长时间才能运行。瓦尔格林德问题?冠状病毒问题?

azure - 在应用程序之间共享 ASP.NET Core 数据保护,而不破坏现有的 cookie 和 token

c# - 简单注入(inject)器注入(inject) PageModel ASP.NET Core Razor 页面

c# - 获取最新的 checkin 号(最新的变更集 ID)

c# - 无法加载 DLL ‘ABCpdf9-32.dll’。找不到指定的模块(HRESULT 异常 : 0x8007007E)

c# - 具有自定义 iOS 负载的 Amazon Simple Notification Service 并不那么简单

angular - 如何在 Angular 4 上使用 Typescript 2 和 Jasmine 2 模拟或监视没有对象的外部函数

android - InstrumentationTestCase 和 AndroidTestCase 的区别

asp.net-core - 在 VS 2019 预览版中没有可用于使用 .Net Core 3.0 的选项