public class MyService
{
private readonly ISomething _something;
private readonly Func<IRarelyGetUsed> _rarelyGetUsed;
public MyService(ISomething something, Func<IRarelyGetUsed> rarelyGetUsed)
{
_something = something;
_rarelyGetUsed = rarelyGetUsed;
}
}
Мы используем Autofac для нашего МОК и обнаружил, мы можем получить большую прибыль производительности (под нагрузкой), используя Func<T>
подход, потому что эти зависимости не разрешатся, пока они не будут и в некоторых сценариях некоторые зависимости не используются.Moq CreateInstance терпит неудачу, когда конструктор имеет зависимости с помощью Func <T>
Мы также используем Moq для некоторых модульных испытаний.
var _container = new AutoMocker();
var _service = _container.CreateInstance<MyService>();
На данный момент она взрывается - System.NullReferenceException : Object reference not set to an instance of an object.
Кто знает, как сказать Moq, чтобы хорошо играть с Func зависимостей?
Обратите внимание, что если я изменю Func<IRarelyGetUsed>
на IRarelyGetUsed
, не будет никаких исключений.
Редактировать: Оказывается, пакет nuget был довольно старым - после обновления пакета https://github.com/tkellogg/Moq.AutoMocker
это теперь работает.
Однако, есть еще одна проблема, решить -
_container.GetMock<Func<IRarelyGetUsed>>().Setup(p => p().DoSomething(It.IsAny<string>())).Returns(true).Verifiable();
Попытка установить результат выше результата метода в - Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpressionN' to type 'System.Linq.Expressions.InvocationExpression'
Edit 2:
var serviceMock = _container.GetMock<IRarelyGetUsed>();
serviceMock.Setup(r => r.DoSomething()).Returns(someData);
_container.GetMock<Func<IRarelyGetUsed>>().Setup(s => s()).Returns(serviceMock.Object);
выше, работает, однако для этого необходимо установить как Func<IRarelyGetUsed>
, так и IRarelyGetUsed
- было бы неплохо, если бы это было необходимо только для этого, иначе на один тест больше накладных расходов.
Правки имеют смысл, как вы действительно должны настройте делегата (Func), а также то, что вы хотите высмеять. Вероятно, вы могли бы написать метод расширения для 'AutoMocker', например' SetupFunc (Mock mock, object returnData) ', который содержит код шаблона, который вы должны были записать в Edit 2. –
Scott