xUnit类构造函数应该从理论测试方法中传递参数

3
在xUnit网站上,关于构造函数有以下内容:
xUnit.net为每个运行的测试类创建一个新实例,因此放置在测试类构造函数中的任何代码都将为每个单独的测试运行。这使得构造函数成为放置可重复使用的上下文设置代码的方便位置,其中您希望共享代码而不共享对象实例(这意味着您会为每个运行的测试获得上下文对象的干净副本)。
我有以下代码:
public class ProfilePageTest
{
    public ProfilePageTest(Role role) 
    {
        AuthRepository.Login(role)
    }

    [Theory]
    [Roles(Role.Editor, Role.Viewer)]
    public void OpenProfilePageTest(Role role)
    {
        var profile = GetPage<ProfilePage>();
        profile.GoTo();
        profile.IsAt();
    }
}

是否可以将角色从理论属性传递到构造函数中,这样我就不必在每个测试方法中执行AuthRepository.Login(role)了。


1
不,这是不可能的。Login方法是测试的一部分,在每个测试中编写它将为未来的读者/维护人员提供更多的价值,而不是将其干涸/隐藏在一个地方。 - Fabio
2个回答

2
不,这是不可能的。构造函数将在任何其他操作之前运行,就像你习惯的任何构造函数一样。但我认为在每个测试中调用 AuthRepository.Login(role) 没有什么害处,因为它只是一行代码。

1

这篇博客文章非常出色,介绍了不同的方法将数据传递到xUnit测试中,但所有方法都是将数据传递给单个方法(测试),而不是构造函数。

如果您想为多个测试设置某些内容,可以查看 IClassFixture

简要概述,您可以设置一个包含共享数据的类:

public class DatabaseFixture : IDisposable
{
    public DatabaseFixture()
    {
        Db = new SqlConnection("MyConnectionString");

        // ... initialize data in the test database ...
    }

    public void Dispose()
    {
        // ... clean up test data from the database ...
    }

    public SqlConnection Db { get; private set; }
}

然后在您的测试中,您可以将该类(以及数据)“注入”到测试类中:

public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture fixture;

    public MyDatabaseTests(DatabaseFixture fixture)
    {
        this.fixture = fixture;
    }

    // ... write tests, using fixture.Db to get access to the SQL Server ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接