Как создать репозиторий, который использует ninject в модульном тесте - PullRequest
1 голос
/ 22 ноября 2011

У меня есть хранилище вроде:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
   private readonly IContext _db;

   public Repository(IContext context)
   {
      _db =context;
   }

   ...

В Global.asax я настроил нинъект как:

kernel.Bind<IContext>().To<Context>();

Это нормально работает в приложении, вероятно, потому, что я создаю экземпляр для простоты, вызывая конструктор с параметром. Однако в модульных тестах есть проблемы.

Тогда в модульном тесте у меня есть:

var mockUnitOfWork = new Mock<UnitOfWork>();

var mockProjectApprovalRepository = new Mock<Repository<ProjectApproval>>();

mockUnitOfWork.Setup(x => x.ProjectApprovalRepository).Returns(mockProjectApprovalRepository.Object);

В этой последней строке я получаю сообщение об ошибке:

Невозможно создать экземпляр прокси-класса: MyNamespace.Repository Не удалось найти конструктор без параметров.

Я смущен этим, потому что я думал, что смысл Ninject в том, что мне не нужно указывать конструктор без параметров. Не должно было бы создать экземпляр Context и использовать конструктор с одним параметром.

1 Ответ

2 голосов
/ 22 ноября 2011

Когда вы делаете new Mock<Repository<ProjectApproval>>(), вы просите Moq построить объект.Если бы вы попросили Ninject создать его, он бы это сделал.

Ninject волшебным образом не вмешивается в процесс строительства - new по-прежнему new.

В этом случае выможет использовать перегрузку конструктора Mock, в котором вы указываете дополнительные аргументы.

Обратите внимание, что общепринято, что Ninject не должен находиться близко к чему-либо, что близко к любому общему определению термина Unit Test.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...