Упрощение тестового класса без генериков

У меня есть большая коллекция моделей, которые все реализуют 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(...),

Другие вопросы по тегам