public class MyService
{
private readonly ISomething _something;
private readonly Func<IRarelyGetUsed> _rarelyGetUsed;
public MyService(ISomething something, Func<IRarelyGetUsed> rarelyGetUsed)
{
_something = something;
_rarelyGetUsed = rarelyGetUsed;
}
}
私たちは IOC に Autofac を使用しており、この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
これは機能するようになりました。
ただし、解決すべき問題がもう 1 つあります。
_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
必要があります。1 つだけを実行する必要がある場合は便利ですが、そうでない場合は、テストごとのオーバーヘッドが大きくなります。