Упрощение тестового класса без генериков
У меня есть большая коллекция моделей, которые все реализуют IEquatable<T>
для которого у меня есть несколько похожих классов теста, кроме типа SUT. Тесты подтверждают реализацию и некоторые другие общие аспекты, реализованные тестируемыми моделями.
Использование абстрактного универсального тестового класса мало что дает, я теряю разрешение перегрузки времени компиляции для операторов, и мне все равно приходится реализовывать производный тестовый класс для каждого типа.
С использованием MemberData
Атрибут помогает устранить необходимость в производных тестовых классах, однако разрешение перегрузки времени компиляции для операторов остается.
Существует ли другой подход, такой как InlineData
где я поддерживаю разрешение перегрузки времени компиляции для операторов и имею одну коллекцию объектов (независимо от того, являются ли они типами или нет) для вызова методов тестирования?
В приведенном ниже примере я использую MemberData
но должен использовать отражение, чтобы вызвать ==
а также !=
операторы и сигнатуры тестового метода менее чем оптимальны, поскольку они не используются (используется только параметр общего типа).
[Theory]
[MemberData(nameof(GetModelTypes))]
public void MyTest<T>(T _)
where T : class, new()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
// Add any known type customization's...
T t = fixture.Create<T>();
// Implement remaining generic test body.
}
public static IEnumerable<object[]> GetModelTypes() =>
{
new object[] {new ModelA()},
new object[] {new ModelB()},
/* ... */
}
Кто-нибудь знает методологию, которая позволит мне поддерживать одну коллекцию объектов и тестировать с разрешением перегрузки времени компиляции?
2 ответа
Вы можете написать общие классы модульных тестов с xUnit.net следующим образом:
public abstract class ModelTests<T>
{
[Fact]
public void MyTest()
{
var fixture = new Fixture();
var sut = fixture.Create<T>();
// The rest of the test goes here...
}
// More tests go here...
}
public class ModelATests : ModelTests<ModelA> { }
public class ModelBTests : ModelTests<ModelB> { }
Тем не менее, если у вас есть множество похожих тестов, возможно, стоит поискать AutoFixture.Idioms, и особенно его IdiomaticAssertion
Базовый класс.
Во-первых, самоубийство - иметь единую статическую коллекцию для тестирования различных типов поведения. Не стреляй в себя. Во-вторых, не совсем понятно, чего вы пытаетесь достичь, за исключением того факта, что теперь наличие атрибута am дает вам возможность управлять отражением. Если ваш вопрос был об отражении всего вместе с дженериками, то это действительно возможно. Проверьте что-то вроде typeof(GenericType<>).MakeGenericType(...)
,