Как мне написать общие тесты для всех реализаций интерфейса с MSpec?

У меня есть интерфейс IAudioProcessor с единственным методом IEnumerable Process (IEnumerable samples) . Хотя это не является требованием самого интерфейса, я хочу убедиться, что все мои реализации следуют некоторым общим правилам, например:

  1. Использовать отложенное выполнение
  2. Не изменять входные образцы

Это Нетрудно создать для них тесты, но мне пришлось бы копировать и вставлять эти тесты для каждой реализации. Я бы хотел этого избежать.

Я хотел бы сделать что-то подобное (обратите внимание на атрибут GenericTest и параметр типа):

[GenericTest(typeof(AudioProcessorImpl1Factory))]
[GenericTest(typeof(AudioProcessorImpl2Factory))]
[GenericTest(typeof(AudioProcessorImpl3Factory))]
public class when_processed_audio_is_returned<TSutFactory>
    where TSutFactory : ISutFactory<IAudioProcessor>, new()
{
    static IAudioProcessor Sut = new TSutFactory().CreateSut();
    protected static Context _ = new Context();

    Establish context = () => _.Original = Substitute.For<IEnumerable<ISample>>();

    Because of = () => Sut.Process(_.Original);

    It should_not_have_enumerated_the_original_samples = () =>
    {
        _.Original.DidNotReceive().GetEnumerator();
        ((IEnumerable)_.Original).DidNotReceive().GetEnumerator();
    };
}

Возможно ли что-то подобное?

8
задан Anthony Mastrean 16 November 2011 в 05:53
поделиться