0

タイトルが示すように、コンストラクターも取る具象クラスを実装するインターフェイスを解決しようとしています。

例として、具体的なサービス クラスを次に示します。

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);
    }
4

2 に答える 2

2

コントローラーをテストするときは、これを行う必要はありません。その場合、コントローラーは IMessageService のモックのみを必要とします。

さらに、Index メソッドをテストするために、コンテナーは関与していないため、コンテナーはまったく使用しません。

このような何かがそれを行う必要があります:

// arrange
var messageService = new Mock<IMessageService>();
// setup message service
...

var controller = new HomeController(messageService.Object);

// act
...
于 2012-10-03T02:46:50.693 に答える