public class MyService
{
private readonly ISomething _something;
private readonly Func<IRarelyGetUsed> _rarelyGetUsed;
public MyService(ISomething something, Func<IRarelyGetUsed> rarelyGetUsed)
{
_something = something;
_rarelyGetUsed = rarelyGetUsed;
}
}
我们将 Autofac 用于我们的 IOC,并发现使用该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'
编辑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
- 如果只需要做一个就好了,否则每次测试都会有更多的开销。