Может ли JustMock возвращать значение на основе параметра? - PullRequest
4 голосов
/ 14 сентября 2011

Используя JustMock, можно ли организовать макет для возврата чего-либо на основе входного параметра?

Например, скажем, метод принимает int, я хочу вернуть это значение + 1
Я хочу, чтобы выходные данные всегда были смоделированы как входные + 1, но я не знаю входные данные во время разработки.

Мое реальное использование для этого - с параметром объекта, и мне нужно смоделировать, чтобы всегда возвращать новыйобъект, имеющий некоторые с такими же свойствами ... но я не знаю, как ссылаться на параметры в разделе .Returns().

РЕДАКТИРОВАТЬ: Подробнее:

Три типа:
IMoneyConverter
Money
Currency

Money Объект имеет два свойства: decimal valueAmount и Currency valueCurrency

IMoneyConverter выставляет:

.Convert(Money valueFrom, Currency currencyTo, DateTime asOfDate)

Этот метод возвращает преобразованный объект Money в новом Currency (currencyTo) на указанную дату.

Мое намерение - смоделировать IMoneyConverter, чтобы его метод .Convert возвращал новый объект Money, имеющий значение параметра Money (valueFrom)r и Currency параметра currencyTo.

Ответы [ 2 ]

5 голосов
/ 04 июля 2012

Я не уверен на 100%, что понял точные требования, но этот тест работает, и я верю, что он продемонстрирует, как выполнить то, что вы хотите:

[Test]
public void SampleTest() {
   IMoneyConverter mock = Mock.Create<IMoneyConverter>();
   mock.Arrange( x => x.Convert( Arg.IsAny<Money>(), Arg.IsAny<Currency>(), Arg.IsAny<DateTime>() ) )
      .Returns( (Func<Money,Currency,DateTime,Money>)
         ( (m, c, d ) => new Money { ValueAmount = m.ValueAmount, Currency = c }) );

   Money inMoney = new Money() { ValueAmount = 42 };
   Currency inCurrency = new Currency();
   Money outMoney = mock.Convert( inMoney, inCurrency, DateTime.Now );
   Assert.AreEqual( 42, outMoney.ValueAmount  );
   Assert.AreSame( inCurrency, outMoney.Currency );
}

public interface IMoneyConverter {
   Money Convert( Money valueFrom, Currency currencyTo, DateTime asOfDate );
}

public class Money {
   public decimal ValueAmount { get; set; }
   public Currency Currency { get; set; }
}

public class Currency {
}
5 голосов
/ 03 января 2012

Да, это возможно, см. Пример.

var foo = Mock.Create<IFoo>();
Mock.Arrange(() => foo.Echo(Arg.IsAny<int>())).Returns((int i) => ++i);
...