7

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

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

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

编辑:更多细节:

三种类型:
IMoneyConverter
Money
Currency

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

IMoneyConverter暴露:

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

此方法以指定日期Money的新 (currencyTo) 形式返回转换后的对象。Currency

我的意图是模拟,IMoneyConverter以便它的.Convert方法返回一个新Money对象,该对象具有Money(valueFrom) 参数的数量和CurrencycurrencyTo 参数的数量。

4

2 回答 2

7

我不是 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 {
}
于 2012-07-03T20:34:31.770 回答
6

是的,这是可能的,请参见示例。

var foo = Mock.Create<IFoo>();
Mock.Arrange(() => foo.Echo(Arg.IsAny<int>())).Returns((int i) => ++i);
于 2012-01-03T17:34:25.477 回答