Вземете името на изпълнявания тест в Xunit

Използвайки Xunit, как мога да получа името на текущия тест?

  public class TestWithCommonSetupAndTearDown : IDisposable
  {
    public TestWithCommonSetupAndTearDown ()
    {
      var nameOfRunningTest = "TODO";
      Console.WriteLine ("Setup for test '{0}.'", nameOfRunningTest);
    }

    [Fact]
    public void Blub ()
    {
    }

    public void Dispose ()
    {
      var nameOfRunningTest = "TODO";
      Console.WriteLine ("TearDown for test '{0}.'", nameOfRunningTest);
    }
  }

Редактиране:
По-конкретно, търся заместител на свойството NUnits TestContext.CurrentContext.Test.Name.


person Julian Lettner    schedule 10.05.2013    source източник


Отговори (3)


Можете да използвате BeforeAfterTestAttribute, за да разрешите вашия случай. Има някои начини да разрешите проблема си с помощта на Xunit, което би било да направите подклас на TestClassCommand или FactAttribute и TestCommand, но мисля, че BeforeAfterTestAttribute е най-простият начин. Вижте кода по-долу.

public class TestWithCommonSetupAndTearDown
{
    [Fact]
    [DisplayTestMethodName]
    public void Blub()
    {
    }

    private class DisplayTestMethodNameAttribute : BeforeAfterTestAttribute
    {
        public override void Before(MethodInfo methodUnderTest)
        {
            var nameOfRunningTest = "TODO";
            Console.WriteLine("Setup for test '{0}.'", methodUnderTest.Name);
        }

        public override void After(MethodInfo methodUnderTest)
        {
            var nameOfRunningTest = "TODO";
            Console.WriteLine("TearDown for test '{0}.'", methodUnderTest.Name);
        }
    }
}
person Jin-Wook Chung    schedule 25.09.2014
comment
Работи за мен. Атрибутът може да се приложи към класа, за да се изпълнява за всички тестови методи в класа. - person Tom; 01.05.2020

Вижте подобен въпрос в Github, където трябва да използвате отговор/заобиколно решение малко инжектиране и отражение в конструктора.

public class Tests
  {
  public Tests(ITestOutputHelper output)
    {
    var type = output.GetType();
    var testMember = type.GetField("test", BindingFlags.Instance | BindingFlags.NonPublic);
    var test = (ITest)testMember.GetValue(output);
    }
<...>
  }
person LosManos    schedule 16.07.2019

Не мога да говоря с xUnit ... но това ми свърши работа в VS Testing. може би си струва да опитаме.

Справка: Как да получите име на текущия метод от код

Пример:

[TestMethod]
public void TestGetMethod()
{
    StackTrace st = new StackTrace();
    StackFrame sf = st.GetFrame(0);
    MethodBase currentMethodName = sf.GetMethod();
    Assert.IsTrue(currentMethodName.ToString().Contains("TestGetMethod"));
 }
person urbanlemur    schedule 10.05.2013
comment
Благодаря Ви за отговора. Наясно съм с тази опция (използвам я в момента) и търся друга опция. - person Julian Lettner; 11.05.2013
comment
Не съм сигурен, че е съществувал по време на този отговор, но ако използвате MSTest, можете да разчитате на екземпляр на TestContext във вашия тестов клас, който автоматично ще бъде зададен в моя тестов изпълнител, като ви дава името на изпълнявания тест и други. - person ChiefTwoPencils; 09.10.2019