Я пытался обдумать эту проблему: как создать модульный тест, который проверяет, завершается ли функция из-за сбоя Debug.Assert (из System.Diagnostics
), помечая его как пройденный, когда он это делает, икак не удалось.
Я знаю, NUnit
имеет функцию [ExpectedException(typeof( ArgumentException ) )]
, но я не могу выяснить, что это за исключение на веб-сайте MSDN.Интуиция сказала бы, что это может быть что-то вроде AssertionException, и оно действительно существует ... но является частью инфраструктуры NUnit.Я думаю, что это исключение NUnit Assert бросить вокруг.Я мог бы просто обнулить его, используя:
[ExpectedException(typeof(Exception))]
Но это вызывает проблему, которая появляется в стандартном окне отладки Windows.В своих поисках я наткнулся на способы убрать это окно из списка, но это похоже на то, что вы доставили нож для разделки мяса в операционный стол, где вы обычно используете скальпель.Потому что я хочу видеть это окно, когда происходит что-то неожиданное, когда я выполняю свою программу.
Я думаю, что есть обходной путь замены метода Debug.Assert
на NUnit
аналог (яЯ все еще в начале своего проекта, так что это не слишком большой рефакторинг), но я предполагаю, что многие программисты придерживаются функциональности Debug.Assert
, как это стандартно в .NET.
Как таковой, я хотел бы знать, как "утверждать" Debug.Assertion
сбои без необходимости "убивать" экран отладки Windows из моего проекта?
Чтобы иметь конкретный примериз контракта в моем коде есть пример ниже.Для тех, кому это может показаться знакомым, это таблица To-Wound из настольной варгейма Warhammer 40K, написанная как функция.
static public int assaultToHit(int _attacker_WeaponSkill,
int _defender_WeaponSkill)
{
//Preconditions
Debug.Assert(_attacker_WeaponSkill >= 1 && _attacker_WeaponSkill <= 10,
"Weapon Skill stat must be in range [1,10]");
Debug.Assert(_defender_WeaponSkill >= 1 && _defender_WeaponSkill <= 10,
"Weapon Skill stat must be in range [1,10]");
int target;
if (_attacker_WeaponSkill > _defender_WeaponSkill)
{
target=3;
}
else if (_defender_WeaponSkill >= (_attacker_WeaponSkill + _attacker_WeaponSkill + 1))
{
target=5;
}
else
{
target=4;
}
//postconditions
Debug.Assert(target >= 3 && target <= 5,
"To hit target for assault must be in range [3,5]");
return target;
}
Функция для проверки предварительных условий будет выглядеть примерно так:
[TestCase(-1,2)]
[TestCase(1, -2)]
[TestCase(-1, -2)]
[TestCase(11, 2)]
[TestCase(1, 20)]
[TestCase(11, 20)]
[ExpectedException(typeof(Exception))]
public void testContract_AssaultToHit(int _attacker_weaponskill,
int _defender_weaponskill)
{
Warhammer40kRules.assaultToHit(_attacker_weaponskill,
_defender_weaponskill);
}