Это лучшее, что я мог придумать, это не идеально, но он действительно выполняет то, что вы хотите.
Создается новый класс, который реализует сгенерированный класс xunit. В моем примере, сгенерированный класс называется YourNormalFeatureClass
public class SpecialTest : YourNormalFeatureClass
{
private Xunit.Abstractions.ITestOutputHelper helper;
public SpecialTest(ITestOutputHelper helper) : base()
{
this.helper = helper;
}
public override void ScenarioSetup(ScenarioInfo scenarioInfo)
{
base.ScenarioSetup(scenarioInfo);
// you'd want a better way to keep track of this string
TechTalk.SpecFlow.TestRunnerManager.GetTestRunner().ScenarioContext.Set(this.helper, "helper");
}
}
Теперь вы сможете получить доступ к XUnit ITestOutputHelper
внутри ваших шагов файла через
var helper = this._scenarioContext.Get<Xunit.Abstractions.ITestOutputHelper>("helper");
helper.WriteLine("output from within the steps file that will be written to xunit!");
Вы должны были бы быть оборонительным с этим helper
переменная, чтобы вы не получили NullReferenceException
's
Недостатком этого является то, что у вас теперь есть 2 копии одного и того же теста, потому что вы унаследовали старый тест. Поэтому в этом случае у вас есть тесты от SpecialTest
и YourNormalFeatureClass
. Это означает, что вам не нужно будет запускать тесты YourNormalFeatureClass
и выполнять только тесты SpecialTest
.
Все это легко решить, если SpecFlow позволяет настроить процесс генерации кода. Таким образом, вы можете открыть ITestOutputHelper
сгенерированный код. Потребление его из шагов будет одинаковым.
Не можете ли вы просто 'Trace.WriteLine' или' Debug.WriteLine' в ваших шагах? –
Описан в ссылке, которую @Avalanchis предоставил в другом комментарии. но, к сожалению, xUnit2 не фиксирует вывод Trace и Debug. Вы должны использовать ITestOutputHelper. [rant on] Я начинаю больше не любить xUnit.net. Даже на github, похоже, только очень мало участников, и не так много коммитов и ответов, чтобы ответить на проблемы, о которых сообщалось. [rant off] – softbear