JustMock可以根据参数返回一个值吗?

时间:2011-09-14 17:31:44

标签: mocking telerik justmock

使用JustMock,我可以根据输入参数安排模拟返回一些东西吗?

例如,假设一个方法接收int,我想返回该值+ 1
我希望输出始终被模拟为输入+ 1,但我不知道设计时的输入。

我对此的实际用法是使用对象参数,我需要模拟以始终返回具有相同属性的某些的新对象...但我不知道如何引用参数在.Returns()部分。

编辑:更多详情:

三种类型:
IMoneyConverter
Money
Currency

Money个对象有两个属性:decimal valueAmountCurrency valueCurrency

IMoneyConverter曝光:

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

此方法返回转换后的Money对象,在指定日期的新Currency(currencyTo)中。

我的目的是模拟IMoneyConverter,以便其.Convert方法返回一个新的Money对象,其中包含Money(valueFrom)参数和{{ CurrencyTo参数的1}}。

2 个答案:

答案 0 :(得分:5)

是的,有可能,参见示例。

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

答案 1 :(得分:5)

我不是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 {
}