Использование констант класса для атрибута [Range] - PullRequest
2 голосов
/ 17 февраля 2012

Для модульного теста я хочу использовать Range attribute от NUnit для проверки входов функции в диапазоне.Нижний и верхний пределы этого диапазона закодированы в постоянные свойства класса (шаблон Singleton).Я хотел бы указать начальную и конечную точки Range attribute со свойствами класса, что-то вроде этого:

[Test]
public void sometest([Range(MyClass.LOWER_LIMIT,MyClass.UPPER_LIMIT)] int var)
{
    //Do something and assertive with the nice variable
}

Однако этот подход не работает.Хотя это не ясно из самой документации, похоже, что Range attribute должны быть обеспечены постоянными переменными.В то время как мои константы класса являются статическими свойствами, с определением только они, это захватывает постоянную переменную.

Я написал и ответил на этот вопрос, но это действительно способ установить параметры диапазона на основе константы класса в NUnit?Или есть более элегантное решение?

1 Ответ

2 голосов
/ 23 марта 2012

В следующем примере показано, как можно использовать (постоянные) свойства класса в качестве значений, используемых с атрибутом Range из NUnit.

const int LO_LIM = 1;
const int HI_LIM = 10;

[Test]
public void assertConstantsCorrect()
{
    //Will fail if constants change during development!
    Assert.AreEqual(MyClass.LOWER_LIMIT,LO_LIM);
    Assert.AreEqual(MyClass.UPPER_LIMIT,HI_LIM);
}

[Test]
public void sometest([Range(LO_LIM,HI_LIM)] int var)
{
    //Do test
}

Первым шагом является определение констант в вашем тестовом классе, поскольку атрибут Range работает только с константами. Эти константы принимают те же значения, что и константы, определенные в свойствах вашего класса.

Второй - это тест, созданный для проверки их соответствия. Если в более позднюю дату и время константы в MyClass изменятся, сбой в этом тесте уведомит вас об этом изменении. Обратите внимание, что если этот тест не пройден, любой другой тест, использующий эти константы, может считаться недействительным, поскольку он основывается на ложных предположениях!

Lasty - ваши фактические тесты, которые используют эти значения в предложении [Range( start, end)].

В качестве альтернативы, вы также можете использовать атрибут [TestFixtureSetUp] вместо атрибута [Test] для метода assertConstantsCorrect(), чтобы все тесты в приборе не выполнялись в случае сбоя assertConstantsCorrect(). Еще одна альтернатива состоит в том, чтобы заставить пользовательский атрибут работать для определенных методов, которые вы, как программист, комментируете, и делать эти методы ошибочными, когда assertConstantsCorrect() терпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...