У меня есть следующий класс, который использует внедрение конструктора:
public class Service : IService
{
public Service(IRepository repository, IProvider provider) { ... }
}
Для большинства методов этого класса я просто создаю макеты Moq для IRepository
и IProvider
и конструирую Service
. Однако в классе есть один метод, который вызывает несколько других методов того же класса. Для тестирования этого метода вместо тестирования всех этих методов вместе я хочу проверить, правильно ли метод вызывает эти методы и правильно обрабатывает их возвращаемые значения.
Лучший способ сделать это - издеваться над Service
. Раньше я без проблем издевался над конкретными классами с помощью Moq. Я даже издевался над конкретными классами, которые требуют аргументов конструктора с Moq без проблем. Однако мне впервые потребовалось передать имитируемые аргументы в конструктор имитируемого объекта. Естественно, я пытался сделать это так:
var repository = new Mock<IRepository>();
var provider = new Mock<IProvider>();
var service = new Mock<Service>(repository.Object, provider.Object);
Однако это не работает. Вместо этого я получаю следующую ошибку:
Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: My.Namespace.Service.
Could not find a constructor that would match given arguments:
Castle.Proxies.IRepository
Castle.Proxies.IProvider
Это нормально работает, если конструктор Service
принимает простые аргументы, такие как int
s и string
s, но не принимает интерфейсы, над которыми я издеваюсь. Как ты делаешь это?