HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpModerate

Different return values the first and second time with Moq

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
moqwithsecondreturnandtimethevaluesdifferentfirst

Problem

I have a test like this:
[TestCase("~/page/myaction")]
public void Page_With_Custom_Action(string path) {
// Arrange
var pathData = new Mock();
var pageModel = new Mock();
var repository = new Mock();
var mapper = new Mock();
var container = new Mock();

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

repository.Setup(x => x.GetPageByUrl(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 runs twice in my DashboardPathResolver, how can I tell Moq to return null the first time and pageModel.Object the second?

Solution

Adding a callback did not work for me, I used this approach instead http://haacked.com/archive/2009/09/29/moq-sequences.aspx and I ended up with a test like this:

[TestCase("~/page/myaction")]
[TestCase("~/page/myaction/")]
public void Page_With_Custom_Action(string virtualUrl) {

// Arrange
var pathData = new Mock();
var pageModel = new Mock();
var repository = new Mock();
var mapper = new Mock();
var container = new Mock();

container.Setup(x => x.GetInstance()).Returns(repository.Object);
repository.Setup(x => x.GetPageByUrl(virtualUrl)).ReturnsInOrder(null, 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(virtualUrl);

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

Context

Stack Overflow Q#7287540, score: 32

Revisions (0)

No revisions yet.