2013-07-27 6 views
4

У меня есть интерфейс с рядом общих методов. Эти методы выполняют операции, основанные на типе данных, которые передаются. Как мне это сделать с помощью NSubstitute? На данный момент мне пришлось прибегать к использованию конкретного класса вместо макета, так как я не могу обрабатывать все возможные типы, с которыми будет вызван метод.Откалывающий общий метод с NSubstitute

public interface IInstanceSource 
{ 
    bool CanCreate<T>(); 
    T Create<T>(); 
    void Register<T>(Func<T> creator); 
} 

    public static IInstanceSource GetInstanceSource() 
    { 
     var _data = new Dictionary<Type, Func<object>>(); 
     var a = Substitute.For<IInstanceSource>(); 
     //code below fails since T is not defined. How do I make the code below accept any type? 
     a.WhenForAnyArgs(x=>x.Register(Arg.Any<Func<T>>)).Do(x=> { /* todo */}); 
     a.CanCreate<T>().Returns(x => _data[typeof (T)]); 
     return a; 
    } 

спасибо.

ответ

4

NSubstitute не поддерживает автоматическое создание нескольких экземпляров общего метода.

Как мы обычно видим, используется в тесте, чтобы сконфигурировать его для определенного кода тестируемого кода, так что T будет известен. Если один прибор должен работать на несколько разных T, мы могли бы упростить настройку, используя вспомогательный метод, например ConfigureInstanceSource<T>(), который будет выполнять шаги конфигурации для определенного T.

В вашем случае, хотя вам кажется, что вы хотите фиксированное поведение для всех фальшивых экземпляров IInstanceSource, и в этом случае я считаю, что вы правильно поработали с этим путем ручной кодировки собственного тестового двойника.

+0

Спасибо. Мне пришлось написать класс, который реализует '' '' '' '' '' '' '' '' '' '' '' '' '. Он работает отлично. Хотя, возможно, это было поддержано по умолчанию, и я этого не видел. – ritcoder