【问题标题】:xUnit Abstract Test Class with virtual test methods with parametersxUnit 抽象测试类,带有带参数的虚拟测试方法
【发布时间】:2019-03-05 13:49:07
【问题描述】:

我刚开始使用单元测试,我正在使用 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 ...;
}

但要做到这一点,数据也必须是静态的......

【问题讨论】:

  • 为什么需要 InsertData 是静态的?你得到的错误是什么?
  • 由 xUnit 框架定义... MemberData 必须引用静态成员...
  • 查看here 示例,了解如何使用 MemberData
  • 没有像我这样的例子......他只使用不同的数据类......
  • I can't find a solution to InsertData remain static but to override its value in the inherited class. 这可能不实用

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


【解决方案1】:

理论数据来自静态来源的要求是硬性要求,没有解决方法。但是,根本不需要在抽象类上定义数据。你可以这样做:

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();
    }
}

您在每个实现类上使用相同的名称定义数据。它不是虚拟/抽象的,它只是按名称排列。

【讨论】:

  • 但我的 AbstractTest 类中出现错误 - MemberData 必须引用 AbstractTest 类型上的现有成员“InsertData”
  • 使用它的唯一方法是使用#pragma warning disable xUnit1015,如果可以的话?
  • 是的,没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
相关资源
最近更新 更多