C # каждый атрибут должен выполнять TestMethod - PullRequest
0 голосов
/ 30 октября 2019

Я создал специальный тест DataUttribute для теории xUnit с именем RoleAttribute:

public class RoleAttribute : DataAttribute
{
    public Role Role { get; set; }
    public RoleAttribute(Role role, Action<Role> method)
    {
        Role = role;
        AuthRepository.Login(role);
        method(role);
    }

    public override IEnumerable<object[]> GetData(MethodInfo testMethod)
    {
        return new[] { new object[] { Role } };
    }
}

И у меня есть метод теста OpenProfilePageTest:

public class ProfileTest : AuthTest
{
    [Theory, Priority(0)]
    [Role(Enums.Role.SuperUser, OpenProfilePageTest)]
    [Role(Enums.Role.Editor, OpenProfilePageTest)]
    public void OpenProfilePageTest(Enums.Role role)
    {
        var profile = GetPage<ProfilePage>();
        profile.GoTo();
        profile.IsAt();
    }
}

То, что я хочу, этодля каждой роли (атрибута) он сначала выполняется:

AuthRepository.Login(role); (конструктор RoleAttribute)

, а затем возобновляет работу с кодом внутри метода OpenProfilePageTest(). Прежде чем он повторяет то же самое, но для второго атрибута.

Как я могу это сделать, сейчас я пытаюсь сделать это, передав метод OpenProfilePageTest() внутри атрибута и выполнив его в своем конструкторе. Должен быть лучший способ сделать это, чем обходить метод, которому я верю?

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Наличие Attribute выполнения функций, отличных от предоставления метаданных о его украшенном элементе, смешивает проблемы, которые вызывают ненужные сложности, а не то, для чего он был разработан.

Весь пользовательский атрибут может быть устранен с помощью ивместо этого используются встроенные атрибуты данных

Например,

public class ProfileTest : AuthTest {
    [Theory, Priority(0)]
    [InlineData(Enums.Role.SuperUser)]
    [InlineData(Enums.Role.Editor)]
    public void OpenProfilePageTest(Enums.Role role) {
        //Arrange
        AuthRepository.Login(role);            
        var profile = GetPage<ProfilePage>();

        //Act
        profile.GoTo();

        //Assert
        profile.IsAt();
    }
}

AuthRepository.Login в этом случае является частью установки / схемы для выполнения желаемого варианта использования.

2 голосов
/ 30 октября 2019

Вы можете достичь этого, не передавая метод, вам нужно немного изменить свой атрибут. Я изменил атрибут, чтобы взять все роли, которые вы хотите проверить, и вернуть их в данные. Вот пример

public class RolesAttribute : DataAttribute
{
    private Role[] _roles;
    public RolesAttribute(params Role[] roles)
    {
        _roles = roles;
    }

    public override IEnumerable<object[]> GetData(MethodInfo testMethod)
    {
        var data = new List<object[]>();
        //We need to add each role param to the list of object[] params
        //This will call the method for each role
        foreach(var role in _roles)
            data.Add(new object[]{role});
        return data;
    }
}

Затем в своем тесте вы просто передаете все роли, которые хотите протестировать, в одном атрибуте, например

public class ProfileTest : AuthTest
{
    [Theory, Priority(0)]
    [Roles(Enums.Role.SuperUser, Enums.Role.Editor)]
    public void OpenProfilePageTest(Enums.Role role)
    {
        AuthRepository.Login(role);
        var profile = GetPage<ProfilePage>();
        profile.GoTo();
        profile.IsAt();
    }
}
...