タイトルが示すように、コンストラクターも取る具象クラスを実装するインターフェイスを解決しようとしています。
例として、具体的なサービス クラスを次に示します。
public class MessageService : IMessageService
{
private readonly IMessageGenerator _messageGenerator;
public MessageService(IMessageGenerator messageGenerator)
{
_messageGenerator = messageGenerator;
}
public string GetMessage()
{
return string.Concat(_messageGenerator.GetMessage(), "");
}
}
ご覧のとおり、このサービス クラスには、コンストラクターのパラメーターとしてインターフェイスも必要です。MVC コントローラーのコンストラクターは次のようになります。
private readonly IMessageService _messageSvc;
public HomeController(IMessageService messageSvc)
{
_messageSvc = messageSvc;
}
Unity.Mvc3 のおかげで Bootstrapper のインターフェイスを解決しました
var container = new UnityContainer();
container
.RegisterType<IMessageService, MessageService>()
.RegisterType<IMessageGenerator, MessageGenerator>();
したがって、私が抱えている主な問題は、UnityAutoMoq を使用した単体テスト内で、IMessageGenerator インターフェイスのモック化されたインスタンスを IMessageService に渡す方法です。私はこのようなものがうまくいくと思いますが、そうではありません:
[TestMethod]
public void Index()
{
var container = new UnityAutoMoqContainer();
var controllerContext = container.Resolve<ControllerContext>();
var nMsgSvc = container.Resolve<IMessageService>(container.Resolve<IMessageGenerator>);
var sut = new HomeController(nMsgSvc) { ControllerContext = controllerContext };
ViewResult result = sut.Index() as ViewResult;
Assert.AreEqual("Hello from the MessageGenerator via the MessageService", result.ViewBag.Message);
}