#c# #selenium #automated-tests #xunit #specflow
#c# #селен #автоматизированные тесты #xunit #specflow
Вопрос:
Недавно я переключил проект с NUnit на xUnit, чтобы ITestOutputHelper можно было использовать для вывода в журнал.
Проект представляет собой довольно стандартный макет
Файлы компонентов-> Классы шагов-> Классы страниц -> Классы справки. Включить в вспомогательные классы мы имеем hooks.class также. Я использую бегун xUnit.
Итак, в моем классе hooks я создал это
private readonly ScenarioContext _scenarioContext;
private ITestOutputHelper _testOutputHelper;
public Hooks(ScenarioContext scenarioContext, ITestOutputHelper testOutputHelper)
{
_scenarioContext = scenarioContext;
this._testOutputHelper = testOutputHelper;
}
public void WriteOutput(string theMessage)
{
_testOutputHelper.WriteLine(theMessage);
}
Теперь мой вопрос в том, как мне получить доступ к функции WriteOutput из других классов?
Или я поместил его не в тот класс?
Комментарии:
1. Что вы подразумеваете под «другими классами»? Определения шагов? Модели страниц Selenium? Служебные классы?
2. @GregBurghardt, да, извините, следовало бы пояснить. Классы модели страницы и служебные классы
Ответ №1:
Поскольку ваш класс hooks уже принимает объект ITestOutputHelper, ваши другие определения шагов должны делать только то же самое. С этого момента это просто старая добрая инъекция зависимостей.
Если вы инициализируете модели страниц и служебные классы в каждом классе определения шага, поскольку кажется, что ITestOutputHelper уже зарегистрирован в среде внедрения зависимостей SpecFlow, вы можете просто передавать ссылки на помощника из конструктора в конструктор.
Например, добавьте аргумент конструктора и поле в определение шага:
[Binding]
public class LoginSteps
{
private ITestOutputHelper testOutputHelper;
private LoginPage loginPage;
private SomeUtility utility;
public LoginSteps(IWebDriver driver, ITestOutputHelper testOutputHelper)
{
this.testOutputHelper = testOutputHelper;
// Pass the test output helper to a page model
loginPage = new LoginPage(driver, testOutputHelper);
// Pass the test output helper to a utility class
utility = new SomeUtility(testOutputHelper);
}
[Given(@"the user is logged in as ""(.*)"")")]
public void GivenTheUserIsLoggedInAs(string username)
{
testOutputHelper.WriteLine("...");
loginPage.LogIn(username);
}
}
Тогда для модели страницы и служебного класса требуются аргументы и поля конструктора:
public class LoginPage
{
private IWebDriver driver;
private ITestOutputHelper testOutputHelper;
public LoginPage(IWebDriver driver, ITestOutputHelper testOutputHelper)
{
this.driver = driver;
this.testOutputHelper = testOutputHelper;
}
// ...
}
public class SomeUtility
{
private ITestOutputHelper testOutputHelper;
public SomeUtility(ITestOutputHelper testOutputHelper)
{
this.testOutputHelper = testOutputHelper;
}
// ...
}
Ответ №2:
С помощью другого разработчика получил ответ, см. Ниже
Пошаговый класс TestAppSteps
using Xunit.Abstractions;
[Binding]
public sealed class TestAppSteps : TestAppPage
{
public TestAppSteps(ITestOutputHelper output) : base(output)
{
}
code
}
Класс страницы
TestAppPage с использованием Xunit.Абстракции;
public class TestAppPage : PageAssertions
{
public TestAppPage(ITestOutputHelper output) : base(output)
{
}
code
}
Проверка страниц служебного класса с
использованием Xunit.Абстракции;
public class PageAssertions : SharedClass
{
public PageAssertions(ITestOutputHelper output) : base(output) { }
code inc'
WriteToReport("Pass: URL is correct");
}
Общий класс служебного класса с
использованием Xunit.Абстракции;
public abstract class SharedClass : OutputFunctions
{
public SharedClass(ITestOutputHelper output)
: base(output)
{
}
shared code including
WriteToReport(GetTheCurrentMethod());
}
Функции вывода абстрактного класса
использование Xunit.Абстракции;
public abstract class OutputFunctions
{
protected readonly ITestOutputHelper _output;
public OutputFunctions(ITestOutputHelper output)
{
_output = output;
}
public void WriteToReport(string theMessage)
{
_output.WriteLine(theMessage);
}
}