Moq で 1 回目と 2 回目の戻り値が異なります 質問する

Moq で 1 回目と 2 回目の戻り値が異なります 質問する

次のようなテストがあります:

    [TestCase("~/page/myaction")]
    public void Page_With_Custom_Action(string path) {
        // Arrange
        var pathData = new Mock<IPathData>();
        var pageModel = new Mock<IPageModel>();
        var repository = new Mock<IPageRepository>();
        var mapper = new Mock<IControllerMapper>();
        var container = new Mock<IContainer>();

        container.Setup(x => x.GetInstance<IPageRepository>()).Returns(repository.Object);

        repository.Setup(x => x.GetPageByUrl<IPageModel>(path)).Returns(() => pageModel.Object);

        pathData.Setup(x => x.Action).Returns("myaction");
        pathData.Setup(x => x.Controller).Returns("page");

        var resolver = new DashboardPathResolver(pathData.Object, repository.Object, mapper.Object, container.Object);

        // Act
        var data = resolver.ResolvePath(path);

        // Assert
        Assert.NotNull(data);
        Assert.AreEqual("myaction", data.Action);
        Assert.AreEqual("page", data.Controller);
    }

GetPageByUrlが 2 回実行される場合DashboardPathResolver、Moq にnull1 回目とpageModel.Object2 回目を返すように指示するにはどうすればよいでしょうか?

ベストアンサー1

Moq の最新バージョン (4.2.1312.1622) では、 SetupSequenceを使用して一連のイベントを設定できます。次に例を示します。

_mockClient.SetupSequence(m => m.Connect(It.IsAny<String>(), It.IsAny<int>(), It.IsAny<int>()))
        .Throws(new SocketException())
        .Throws(new SocketException())
        .Returns(true)
        .Throws(new SocketException())
        .Returns(true);

connect の呼び出しは 3 回目と 5 回目の試行でのみ成功し、それ以外の場合は例外がスローされます。

したがって、あなたの例では次のようになります。

repository.SetupSequence(x => x.GetPageByUrl<IPageModel>(virtualUrl))
.Returns(null)
.Returns(pageModel.Object);

おすすめ記事