Класс C#, который я хочу протестировать, принимает экземпляры IEnumerable того же интерфейса. Я использую Ninject для инъекции зависимостей. Как бы я впрыснуть издевается INTO в IEnumerable, используя Ninject MockingKernel MoqИспользование Ninject MockingKernel Moq как добавить несколько mocks для одного и того же интерфейса
public class Foo: IFoo
{
private readonly Dictionary<ContextType, IBar> _bars;
public Foo(IEnumerable<IBar> bars)
{
_bars= bars.ToDictionary(x => x.ContextType);
}
}
public interface IBar
{
ContextType ContextType { get; }
void DoStuff();
}
public enum ContextType
{
Local,
Site,
Test
}
Это как мои регулярные вяжущие выглядит как
//assume _kernel is StandardKernel
_kernel.Bind<IFoo>().To<MyFoo>();
_kernel.Bind<IBar>().To<Bar1>(); //ContextType.Site
_kernel.Bind<IBar>().To<Bar2>(); //ContextType.Local
_kernel.Bind<IBar>().To<Bar3>(); //ContextType.Test
Настройка издевается как ниже впрыскивает только последний макет в Foo (как предполагается впрыскивание 3 шт.)
//using _kernel = new MoqMockingKernel()
_kernel.Bind<IFoo>().To<MyFoo>();
var bar1Mock = _kernel.GetMock<IBar>();barMock1.Setup(m=>m.ContextType).Returns(ContextType.Site);
var bar2Mock = _kernel.GetMock<IBar>();barMock2.Setup(m=>m.ContextType).Returns(ContextType.Local);
var bar3Mock = _kernel.GetMock<IBar>();barMock3.Setup(m=>m.ContextType).Returns(ContextType.Test);
_foo = _kernel.Get<IFoo>();
Любая помощь приветствуется. Спасибо
При привязке дважды к тому же интерфейсу вы на самом деле _overriding_ previous binding, а не добавление нового. Так что, фактически, тип «Bar3» будет создан при разрешении «IBar» в любом месте кода. Можете ли вы объяснить более четко, чего вы пытаетесь достичь? – Yura
У меня есть шаблон стратегии, реализованный с использованием свойства ContextType IBar в качестве ключа. Итак, я добавляю несколько стратегий (Bars) в Foo и хотел бы вводить макеты для каждой стратегии во время тестирования. – JRT