Как создать базовый тестовый класс в Xunit для тестирования реализаций интерфейса? - PullRequest
0 голосов
/ 14 февраля 2020

Я пишу набор тестов для библиотеки классов, используя C# и XUnit. В библиотеке есть ряд классов, которые реализуют интерфейс. Я мог бы просто скопировать и вставить одни и те же тесты для реализации интерфейса в каждый тестовый класс, но мне было интересно, есть ли более точное решение, использующее некоторый базовый класс тестов, который можно наследовать и запускать автоматически без вызова каждого метода по очереди в каждом тестовом классе ,

В этой статье по проекту кода показано, как это будет сделано в mstest с использованием абстрактного базового класса, помеченного TestClass . Резюме дано ниже. Однако я не могу понять, есть ли эквивалент, использующий xunit. Кто-нибудь знает, как к этому подойти? Документы xunit говорят, что в mstest нет эквивалента TestClass .

Интерфейс

public interface IDoSomething
{
  int SearchString(string stringToSearch, string pattern);
}

Один из многих классов, реализующих интерфейс

public class ThisDoesSomething : IDoSomething
{
  public int SearchString(string stringToSearch, string pattern);
  {
    // implementation
  }
}

Базовый класс тестирования интерфейса

[TestClass]
public abstract class IDoSomethingTestBase
{
  public abstract IDoSomething GetDoSomethingInstance();

  [TestMethod]
  public void BasicTest()
  {
    IDoSomething ids = GetDoSomethingInstance();
    Assert.AreEqual("a_string", ids.SearchString("a_string", ".*");
  }
}

Тестовый класс, который тестирует класс, реализующий интерфейс

[TestClass]
public class ThisDoesSomething_Tests : IDoSomethingTestBase
{
  public override IDoSomething GetDoSomethingInstance()
  {
    return new ThisDoesSomething();
  }
}

1 Ответ

1 голос
/ 14 февраля 2020

Работает точно так же ...

public abstract class IDoSomethingTestBase
{
  protected readonly IDoSomething InstanceUnderTest;

  protected IDoSomethingTestBase(IDoSomething instanceUnderTest){
    InstanceUnderTest = instanceUnderTest;
  }

  [Fact]
  public void BasicTest()
  {
    Assert.AreEqual("a_string", InstanceUnderTest.SearchString("a_string", ".*");
  }
}

Фактический тестовый класс:

public class ThisDoesSomething_Tests : IDoSomethingTestBase
{
  public ThisDoesSomething_Tests(): base(new ThisDoesSomething()) { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...