Как заглушить IKernel ninject с помощью Rhino Mocks?

var mocks = new MockRepository();
var access = new Access();
access.ShowRepository = _mocks.Stub<IShowRepository>();
access.ShowRepository.Stub(x => x.GetShows()).Return(new List<Show>());
var kernel =_mocks.Stub<IKernel>();
kernel.Stub(x => x.Get<Access>()).Return(access);

Это вызывает исключение ArgumentNullException:

Сообщение: значение не может быть нулевым.
Имя параметра: источник

Трассировка стека: в System.Linq.Enumerable.Cast[TResult](источник IEnumerable) в Ninject.ResolutionExtensions.Get[T](корень IResolutionRoot, параметры IParameter[]) в MediaMover.Unit.Tests.ViewModelTests.OptionsViewModelTests.b__1(IKernel x) в C:\Users\Dave\Documents\Visual Studio 2010\Projects\Gigatube\MediaMover.Unit.Tests\ViewModelTests\OptionsViewModelTests.cs:строка 33 в Rhino.Mocks.RhinoMocksExtensions.Expect[T,R](T mock , Действие Function2 action) at Rhino.Mocks.RhinoMocksExtensions.Stub[T,R](T mock, Function2) в MediaMover.Unit.Tests.ViewModelTests.OptionsViewModelTests.Initialize() в C:\Users\Dave\Documents\Visual Studio 2010\Projects\Gigatube\MediaMover.Unit.Tests\ViewModelTests\OptionsViewModelTests.cs:строка 33


person Dave    schedule 19.06.2010    source источник
comment
Какая именно строка вызывает исключение?   -  person dtb    schedule 20.06.2010
comment
Последняя строка, в частности, x.Get‹Access›()   -  person Dave    schedule 20.06.2010
comment
Не могли бы вы вставить всю трассировку стека для исключения? Может быть ошибка в Rhino Mocks....   -  person Grzenio    schedule 22.06.2010


Ответы (1)


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

class DbAccessProvider : Provider<Access>
    {
        public Access DbAccess { get; set; }
        protected override Access CreateInstance(IContext context)
        {
            return DbAccess;
        }
    }

class TestModule : NinjectModule
    {
        public DbAccessProvider DbAccessProvider { get; set; }
        public override void Load()
        {
            Bind<Access>().ToProvider(DbAccessProvider);
        }
    }

Вот мой SetUp из моего теста:

access = new Access();
access.SettingsRepository = MockRepository.GenerateStub<ISettingsRepository>();
access.ShowRepository = MockRepository.GenerateStub<IShowRepository>();
access.SettingsRepository.Stub(x => x.GetById(1)).Return(_settings);
DbAccessProvider dbAccessProvider = new DbAccessProvider();
dbAccessProvider.DbAccess = access;
TestModule testModule = new TestModule();
testModule.DbAccessProvider = dbAccessProvider;
var kernel = new StandardKernel(testModule);
target = new OptionsViewModel(kernel);
person Dave    schedule 13.07.2010