Можно ли передать значения параметров в Moq? - PullRequest
27 голосов
/ 02 ноября 2011

Мне нужно смоделировать HttpResponseBase.ApplyAppPathModifier таким образом, чтобы при вызове параметра ApplyAppPathModifier автоматически возвращался макет.

У меня есть следующий код:

var httpResponseBase = new Mock<HttpResponseBase>();
httpResponseBase.Setup(hrb => hrb.ApplyAppPathModifier(/*capture this param*/))
                .Returns(/*return it here*/);

Есть идеи?

EDIT:

Находится решение на первой странице документации Moq (http://code.google.com/p/moq/wiki/QuickStart):

var httpResponseBase = new Mock<HttpResponseBase>();
httpResponseBase.Setup(hrb => hrb.ApplyAppPathModifier(It.IsAny<string>)
                .Returns((string value) => value);

Я внезапно чувствую себя намного глупее, но я думаю, это то, что происходит, когда вы пишете код в 23:30

Ответы [ 2 ]

28 голосов
/ 02 ноября 2011

Да, вы можете вернуть аргумент, переданный методу

httpResponseBase.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>()))
                .Returns((string path) => path);

Вы также можете захватить его, если хотите

string capturedModifier = null;

httpResponseBase.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>()))
                .Callback((string path) => capturedModifier = path);
10 голосов
/ 02 ноября 2011

Использование It:

It.Is<MyClass>(mc=>mc == myValue)

Здесь вы можете проверить ожидание: значение, которое вы ожидаете получить. Что касается возврата, просто верните нужное вам значение.

var tempS = string.Empty;
var httpResponseBase = new Mock<HttpResponseBase>();
httpResponseBase.Setup(hrb => hrb.ApplyAppPathModifier(It.Is<String>(s=>{
           tempS = s;
           return s == "value I expect";
           })))
                .Returns(tempS);
...