У меня следующая проблема.Я хочу протестировать универсальный класс MyClass <'T>.Тем не менее, меня не волнует тип, используемый для T. Однако, когда я создаю экземпляр MyClass в тесте, мне нужно указать, каким должен быть T.Я могу сделать это следующим образом:
var sut = new MyClass<Object>();
Конечно, это работает, однако я не люблю помещать объект конкретно, потому что он предлагает кому-то, читающему этот тест, что, возможно, тип объекта здесь имеет какое-то значение.
Мне нравится подход, используемый AutoFixture, когда каждое значение создается с использованием fixture.Create<T>()
, потому что оно показывает читателю, что значение не очень важно.Пример этого:
[Fact]
public void IntroductoryTest()
{
// Arrange
Fixture fixture = new Fixture();
int expectedNumber = fixture.Create<int>();
MyClass sut = fixture.Create<MyClass>();
// Act
int result = sut.Echo(expectedNumber);
// Assert
Assert.Equal(expectedNumber, result);
}
В приведенном выше коде мы не заботимся о числе, поэтому мы используем AutoFixture как абстракцию о том, что какое-то число необходимо.
Есть литакое решение, но в отношении типов, используемых с родовыми классами?
Что-то вроде: var sut = MyClass<fixture.GenericType>();
Мне все равно, что это за тип.Чтобы объяснить мой вариант использования немного подробнее: у меня есть модуль AutoFac, который используется для регистрации MyClass.В моем тесте я просто хочу проверить, правильно ли модуль регистрирует MyClass.Для этой регистрации я не хочу указывать какой-то конкретный тип, который будет использоваться для MyClass.Это может быть любой.