Коллекция констант для [Test, Pairwise] - PullRequest
0 голосов
/ 24 февраля 2020

Использование c#, нунита, селена для автоматизации. Я хотел бы использовать атрибут [Test, Pairwise] для моего теста, чтобы убедиться, что объект может быть опубликован с любым допустимым значением. У меня есть словарь со всеми допустимыми значениями, но [Values ​​()] - требует const в качестве параметра и ReadOnlyCollection (как было предложено здесь ) не работает для него. У меня ошибка: Значение атрибута должно быть постоянным выражением, выражением typeof или выражением массива типа параметра атрибута.

class ObjectBaseCalls : ApiTestBase
{
    static ReadOnlyCollection<string> AllTypes = new ReadOnlyCollection<string>(new List<string>() { "Value1", "Value 2" });

    [Test, Pairwise]
    public void ObjectCanBePostedAndGeted([Values(AllTypes)] string type)
    {
        //My test
    }
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Я нашел решение, и оно работает для меня. Я создал enum с именем параметра и словарь с именем параметра и значением параметра для каждого параметра объекта и использую enum в конструкторе объектов PairWiseAttribute.

public class MyElement : BaseElement
{  
    public enum Types { Type1, Type2, Type3, Type4}
    public Dictionary<Types, string> AllTypes = new Dictionary<Types, string>()
    {
        { Types.Type1, "Value 1" },
        { Types.Type2, "Value 2" },
        { Types.Type3, "Value 3" },
        { Types.Type4, "Value 4" },
    };
    public enum Category { Category1, Category2, Category3, Category4}
    public Dictionary<Category, string> Categories = new Dictionary<Category, string>()
    {
        { Category.Category1, "Value 1" },
        { Category.Category2, "Value 2" },
        { Category.Category3, "Value 3" },
        { Category.Category4, "Value 4" },
    };
    public MyElement(Types type, Category category)
    {
        type = AllTypes[type];
        category = Categories[category];
    }
}
public class Test
{
    [Test, Pairwise]
    public void ValidBaseCheckElementCalls
    (
        [Values(Types.Type1, Types.Type2, Types.Type3, Types.Type4)] Types objType,
        [Values(Category.Category1, Category.Category2, Category.Category3, Category.Category4)] Category objCategory,
    )

    {
        MyElement element = new MyElement(objType, objCategory);
    }

}
0 голосов
/ 24 февраля 2020

Здесь есть две разные проблемы.

Ошибка "Аргумент атрибута должен быть константным выражением, выражением typeof или выражением массива типа параметра атрибута" исходит от компилятора. Он описывает ограничение любых конструкторов атрибутов в. NET, а не только NUnit. Если вы хотите передать аргументы в самом конструкторе, вы должны использовать постоянные значения.

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

public class ObjectBaseCalls : ApiTestBase
{
    static ReadOnlyCollection<string> AllTypes = new ReadOnlyCollection<string>(new List<string>() { "Value1", "Value 2" });

    [Test]
    public void ObjectCanBePostedAndGeted([ValueSource(nameof(AllTypes))] string type)
    {
        //My test
    }
}

В качестве альтернативы, поскольку у вас есть только один аргумент метода, вы можете использовать TestCaseSourceAttribute ...

public class ObjectBaseCalls : ApiTestBase
{
    static ReadOnlyCollection<string> AllTypes = new ReadOnlyCollection<string>(new List<string>() { "Value1", "Value 2" });

    [TestCaseSource(nameof(AllTypes))]
    public void ObjectCanBePostedAndGeted(string type)
    {
        //My test
    }
}

Любой из них должен работать. Какой из них вы используете здесь - вопрос стиля c.

Вторая проблема связана с использованием PairWiseAttribute. Он используется (наряду с несколькими другими «объединяющими атрибутами», когда у вас есть тест с несколькими параметрами, указанными с помощью Values или ValueSource, и вы хотите, чтобы NUnit комбинировал их различными способами. В ситуации с одним параметром это делает ничего. Вот почему я удалил его из своих примеров выше.

Если вы действительно намеревались написать тест с более чем одним параметром и попросили NUnit решить, как их объединить, я думаю, вам нужно задать другой вопрос, где Вы объясняете, что вы пытаетесь совершить sh.

...