2010-08-27 3 views
31

Есть ли какое-то глобальное состояние где-нибудь, что я могу получить доступ к текущему тестовому имени?Как получить доступ к названию теста NUnit программно?

У меня есть тесты, которые выводят файлы в каталог и читают их обратно. Я бы хотел, чтобы каждый тест создавал директорию для воспроизведения, а затем очищался после себя, и я не хочу указывать это имя в (Я должен был бы сделать его уникальным, а затем убедиться, что каждый тест сохраняет его уникальным: ew). Я мог бы использовать GUID, но мне бы хотелось, чтобы вспомогательные методы могли предположить, что «это место, где должны храниться тестовые файлы», без необходимости использовать этот GUID для них. Опять же, это штырь для глобального состояния где-то.

В принципе, я хочу позвонить как TestRunner.Current.CurrentTest.Name. Существует ли такая вещь?

ответ

22

Я не обновлен до 2.5.7 еще сам, но она включает в себя TestContext класс, который, кажется, чтобы обеспечить именно то, что вы ищете: http://www.nunit.org/index.php?p=releaseNotes&r=2.5.7

+0

Это отлично работает. Я использую Regex для выделения любых символов, которые не работают в имени каталога, и все в порядке. Благодаря! – TALlama

+0

Чтобы использовать его в коде, получите TestContext, вызвав статический метод CurrentContext. Так, например: TestContext.CurrentContext.Test.Name –

4

Предполагая, что один метод за тест, в коде NUnit, вы можете использовать отражение, чтобы получить имя метода из stacktrace.

Если вы пишете вспомогательный метод в коде NUnit вызывается другими методами, чтобы сделать этот файл протоколирования, вы можете использовать этот синтаксис для проверки предыдущего метода:

string MethodName = new StackFrame(1).GetMethod().Name; 

Смотрите ответы на question 44153, "Can you use reflection to find the name of the currently executing method?" Больше подробностей.

+0

Это не будет обрабатывать методы [TestCase], которые вызывают несколько раз, но это достаточно близко, чтобы получить репутацию. – TALlama

25

(Предполагается, что C#)

NUnit.Framework.TestContext.CurrentContext.Test.Name 

или

NUnit.Framework.TestContext.CurrentContext.Test.FullName 
+0

Первоначально предлагалось использовать this.GetType(). ToString() Если вы были ленивыми; однако это не работает для тестов TestCaseSource, вы должны использовать одну из двух перегрузок из TestContext для работы во всех сценариях. – aolszowka

Смежные вопросы