Используя MSTest, мне нужно было получить имя текущего теста из метода [TestInitialize]
. Вы можете получить это из свойства TestContext.TestName
.
Я обнаружил неожиданное различие в поведении между статическим TestContext
который передается методу [ClassInitialize]
и тем, который объявлен как открытое свойство (и устанавливается [ClassInitialize]
теста).
Рассмотрим следующий код:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestContext.Tests
{
[TestClass]
public class UnitTest1
{
public TestContext TestContext { get; set; }
private static TestContext _testContext;
[ClassInitialize]
public static void SetupTests(TestContext testContext)
{
_testContext = testContext;
}
[TestInitialize]
public void SetupTest()
{
Console.WriteLine(
"TestContext.TestName='{0}' static _testContext.TestName='{1}'",
TestContext.TestName,
_testContext.TestName);
}
[TestMethod] public void TestMethod1() { Assert.IsTrue(true); }
[TestMethod] public void TestMethod2() { Assert.IsTrue(true); }
[TestMethod] public void TestMethod3() { Assert.IsTrue(true); }
}
}
Это приводит к выводу следующего (скопированного из выходных данных тестера Resharper в VS2013):
TestContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1'
Ранее я предполагал, что два экземпляра TestContext
будут эквивалентны, но, очевидно, это не так.
-
public TestContext
свойствоpublic TestContext
ведет себя так, как я ожидаю -
private static TestContext
значениеprivate static TestContext
которое передается методу[ClassInitialize]
не имеет. ПосколькуTestContext
имеет свойства, которые относятся кTestContext
тесту, эта реализация кажется вводящей в заблуждение и нарушенной
Есть ли сценарий, в котором вы бы предпочли использовать TestContext
переданный методу [ClassInitialize]
, или его лучше игнорировать и никогда не использовать?