Mam następujące klasy, która wykorzystuje wtrysk konstruktor:Jak wywołać konstruktora z argumentami interfejsu kiedy szyderczy konkretną klasę z Min
public class Service : IService
{
public Service(IRepository repository, IProvider provider) { ... }
}
Dla większości metod w tej klasie, po prostu stworzyć Min kpi dla IRepository
i IProvider
i skonstruować Service
. Istnieje jednak jedna metoda w klasie, która wywołuje kilka innych metod w tej samej klasie. Aby przetestować tę metodę, zamiast testować wszystkie te metody razem, chcę przetestować, czy metoda wywołuje te metody poprawnie i poprawnie przetwarza ich wartości zwracane.
Najlepszym sposobem, aby to zrobić, aby drwić Service
. Wyśmiewałem konkretne klasy z Moq, zanim nie miałem problemu. Nawet wyśmiewałem konkretne klasy, które wymagają argumentów konstruktora z Moq bez problemu. Jednakże, jest to pierwszy raz, kiedy musiał przejść szydzili argumenty do konstruktora dla wyśmiewali obiektu. Oczywiście próbowałem zrobić to w ten sposób:
var repository = new Mock<IRepository>();
var provider = new Mock<IProvider>();
var service = new Mock<Service>(repository.Object, provider.Object);
To jednak nie działa. Zamiast tego pojawia się następujący błąd:
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
Działa to dobrze, jeśli konstruktor Service
„s wykonuje proste argumenty jak int
s oraz string
s, ale nie jeśli ma interfejsy, które mam szyderczy. Jak Ty to robisz?
Którą wersję Moq i wersji zamkowej używasz? Ponieważ Twój przykładowy kod działa poprawnie przy użyciu Moq 4.2.1312.1622 i Castle.Core 3.2.2 ... – nemesv