C# 将ITestOutputHelper与硒、xUnit和C一起使用#

C# 将ITestOutputHelper与硒、xUnit和C一起使用#,c#,selenium,automated-tests,xunit,specflow,C#,Selenium,Automated Tests,Xunit,Specflow,我最近将一个项目从NUnit切换到xUnit,以便可以使用ITestOutputHelper输出到日志 该项目是一个相当标准的布局 功能文件->步骤类->页面类->帮助类。在助手类中包括hooks.class。我正在使用xUnit runner 所以在我的hooks类中,我创建了这个 private readonly ScenarioContext _scenarioContext; private ITestOutputHelper _testOutputHelper; public Hoo

我最近将一个项目从NUnit切换到xUnit,以便可以使用ITestOutputHelper输出到日志

该项目是一个相当标准的布局

功能文件->步骤类->页面类->帮助类。在助手类中包括hooks.class。我正在使用xUnit runner

所以在我的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函数?
或者我把它放错类了吗?

因为你的hooks类已经接受了一个ITestOutputHelper对象,你的其他步骤定义只需要做同样的事情。从这一点上说,这只是一个很好的老式依赖注入

如果在每个步骤定义类中初始化页面模型和实用程序类,因为看起来ITestOutputHelper已经在SpecFlow中注册,所以您只需将对帮助程序的引用从一个构造函数传递到另一个构造函数

例如,将构造函数arg和字段添加到步骤定义中:

[绑定]
公共类登录步骤
{
私有ITestOutputHelper testOutputHelper;
私人登录页面登录页面;
私人公用事业;
公共登录步骤(IWebDriver驱动程序,ITestOutputHelper testOutputHelper)
{
this.testOutputHelper=testOutputHelper;
//将测试输出帮助程序传递给页面模型
loginPage=新的loginPage(驱动程序,testOutputHelper);
//将测试输出帮助程序传递给实用程序类
实用工具=新的SomeUtility(testOutputHelper);
}
[给定(@“用户以“(.*)”身份登录”)]
public void提供了优素福(字符串用户名)
{
testOutputHelper.WriteLine(“…”);
loginPage.LogIn(用户名);
}
}
然后页面模型和实用程序类需要构造函数参数和字段:

公共类登录页
{
私人IWebDriver;
私有ITestOutputHelper testOutputHelper;
公共登录页面(IWebDriver驱动程序,ITestOutputHelper testOutputHelper)
{
this.driver=driver;
this.testOutputHelper=testOutputHelper;
}
// ...
}
公共类实用程序
{
私有ITestOutputHelper testOutputHelper;
公用程序(ITestOutputHelper testOutputHelper)
{
this.testOutputHelper=testOutputHelper;
}
// ...
}

在另一个开发人员的帮助下得到了答案,请参见下文

步骤类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
}
public class PageAssertions : SharedClass
{
    public PageAssertions(ITestOutputHelper output) : base(output) { }

    code inc'
    WriteToReport("Pass: URL is correct");
}
public abstract class SharedClass : OutputFunctions
{
    public SharedClass(ITestOutputHelper output) 
        : base(output)
    {
    }
    
    shared code including
    WriteToReport(GetTheCurrentMethod());
}   
public abstract class OutputFunctions
{
    protected readonly ITestOutputHelper _output;

    public OutputFunctions(ITestOutputHelper output)
    {
        _output = output;
    }

    public void WriteToReport(string theMessage)
    {
        _output.WriteLine(theMessage);
    }
}
实用程序类页面断言 使用Xunit.抽象

public class TestAppPage : PageAssertions
{

    public TestAppPage(ITestOutputHelper output) : base(output)
    {

    }
    
    code
}
public class PageAssertions : SharedClass
{
    public PageAssertions(ITestOutputHelper output) : base(output) { }

    code inc'
    WriteToReport("Pass: URL is correct");
}
public abstract class SharedClass : OutputFunctions
{
    public SharedClass(ITestOutputHelper output) 
        : base(output)
    {
    }
    
    shared code including
    WriteToReport(GetTheCurrentMethod());
}   
public abstract class OutputFunctions
{
    protected readonly ITestOutputHelper _output;

    public OutputFunctions(ITestOutputHelper output)
    {
        _output = output;
    }

    public void WriteToReport(string theMessage)
    {
        _output.WriteLine(theMessage);
    }
}
实用程序类SharedClass 使用Xunit.抽象

public class TestAppPage : PageAssertions
{

    public TestAppPage(ITestOutputHelper output) : base(output)
    {

    }
    
    code
}
public class PageAssertions : SharedClass
{
    public PageAssertions(ITestOutputHelper output) : base(output) { }

    code inc'
    WriteToReport("Pass: URL is correct");
}
public abstract class SharedClass : OutputFunctions
{
    public SharedClass(ITestOutputHelper output) 
        : base(output)
    {
    }
    
    shared code including
    WriteToReport(GetTheCurrentMethod());
}   
public abstract class OutputFunctions
{
    protected readonly ITestOutputHelper _output;

    public OutputFunctions(ITestOutputHelper output)
    {
        _output = output;
    }

    public void WriteToReport(string theMessage)
    {
        _output.WriteLine(theMessage);
    }
}
抽象类输出函数

使用Xunit.抽象

public class TestAppPage : PageAssertions
{

    public TestAppPage(ITestOutputHelper output) : base(output)
    {

    }
    
    code
}
public class PageAssertions : SharedClass
{
    public PageAssertions(ITestOutputHelper output) : base(output) { }

    code inc'
    WriteToReport("Pass: URL is correct");
}
public abstract class SharedClass : OutputFunctions
{
    public SharedClass(ITestOutputHelper output) 
        : base(output)
    {
    }
    
    shared code including
    WriteToReport(GetTheCurrentMethod());
}   
public abstract class OutputFunctions
{
    protected readonly ITestOutputHelper _output;

    public OutputFunctions(ITestOutputHelper output)
    {
        _output = output;
    }

    public void WriteToReport(string theMessage)
    {
        _output.WriteLine(theMessage);
    }
}

“其他类”是什么意思?步骤定义?Selenium页面模型?实用程序类?@GregBurghardt,是的,对不起,应该说得更清楚。页面模型类和实用程序类