Рассмотрим:
class MyClass<T> where T : class
{
}
В этом случае условие where обеспечивает применение спецификации, согласно которой MyClass является только универсальным типом ссылочного типа.
В идеале мне нужно выполнить модульный тест, которыйпроверяет эту спецификацию.Тем не менее, этот модульный тест, очевидно, не будет работать, но он объясняет, что я пытаюсь выполнить:
[Test]
[DoesNotCompile()]
public void T_must_be_a_reference_type()
{
var test = new MyClass<int>();
}
Что я могу сделать, чтобы протестировать спецификацию, которая реализована, не позволяя скомпилировать код?
РЕДАКТИРОВАТЬ :
Дополнительная информация: Хорошо, поэтому я считаю (хаха), что я придерживался методологии TDD, в которой вы не можетенапишите любой код, если у вас нет провального модульного теста.Допустим, у вас было следующее:
class MyClass<T> { }
Какой тест вы можете написать, который провалился бы, если бы T не был классом?Что-то вроде default(T) == null
?
Дальнейшее редактирование :
Так что после «анализа первопричины» проблема заключается в том, что я полагался на то, что default(T)
null
у потребителя этого класса, неявным образом.Я смог преобразовать этот потребительский код в другой класс и указать там ограничение универсального типа (ограничив его class
), что фактически делает этот код не компилируемым, если кто-то снимает ограничение на класс, о котором я говорю выше.