具有参数的虚拟测试方法的xUnit抽象测试类

时间:2019-03-05 13:49:07

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

我刚开始进行单元测试,并且正在使用xUnit框架。我有一个AbstractTest类,该类定义了一些抽象测试方法,这些方法将在每个测试类中使用。 问题出在静态字段-InsertData 。在这种情况下,MemberData必须为静态。我无法为继承类(TestClass)中的InsertData分配一些值,因为在调试器接触两个构造函数之前,我得到了错误。

int i;

// First variant: A is specified explicitly
foo<float>(i);

// Second variant: A is set to B implicitly
// This is because foo < int > (i) is unnecessarily verbose
foo(i);

因为我继承了AbstractTest类,所以将进行测试。 Test class

我找不到解决方案,让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();
    }
}

但是要做到这一点,数据还必须保持静态...

1 个答案:

答案 0 :(得分:3)

对理论数据来自静态来源的要求是一项艰巨的要求,没有解决方法。但是,完全不需要在抽象类上定义数据。您可以这样做:

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

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