Тестирование некомпилируемого кода в NUnit - PullRequest
4 голосов
/ 18 февраля 2010

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

public class MyClass
{
  public string Owner { get; protected set; }

  public MyClass(string owner)
  {
    this.Owner = owner;
  }
}

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

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

Мысли?

Ответы [ 6 ]

10 голосов
/ 18 февраля 2010

Вы можете вызвать Activator.CreateInstance(typeof(MyClass)), чтобы попытаться запустить конструктор по умолчанию, и заявить, что MissingMethodException выброшено.

[Test]
[ExpectedException(typeof(MissingMethodException))
public void ShouldBeNoDefaultConstructorForMyClass()
{
    Activator.CreateInstance(typeof(MyClass));
}
9 голосов
/ 18 февраля 2010

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

5 голосов
/ 18 февраля 2010
ConstructorInfo ci = typeof(MyClass).GetConstructor(Type.EmptyTypes);
Assert.IsNull(ci);
1 голос
0 голосов
/ 18 февраля 2010

Да.Хорошим способом было бы использовать отражение, чтобы попробовать конструктор без параметров в try / catch

0 голосов
/ 18 февраля 2010

вы можете использовать отражение, чтобы проверить, существует ли конструктор arg для класса, и не пройти тест, если есть

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