Насколько я знаю, нет функции, позволяющей настраивать много методов макета одновременно.Вам нужно указать все методы, чтобы перенаправить их в другую реализацию ...
... если только вы не напишите некоторый код отражения для настройки макета.
Вот некоторый (рабочий) код,Он использует C # 3.0, но основная часть - это материал Rhino Mocks «старого стиля», который был написан для C # 2.0.
public static class MockExtensions
{
public static void ForwardCalls<T>(this T mock, T original)
{
mock.BackToRecord();
Type mockType = typeof(T);
var methods = mockType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Union(mockType.GetInterfaces().SelectMany(x => x.GetMethods(BindingFlags.Public | BindingFlags.Instance)));
foreach (MethodInfo method in methods)
{
List<object> args = new List<object>();
foreach (var arg in method.GetParameters())
{
args.Add(CreateDefaultValue(arg.ParameterType));
}
method.Invoke(mock, args.ToArray());
var myMethod = method;
if (method.ReturnType == typeof(void))
{
LastCall
.IgnoreArguments()
// not Repeat.Any to allow overriding the value
.Repeat.Times(int.MaxValue)
.WhenCalled(call => myMethod.Invoke(original, call.Arguments));
}
else
{
LastCall
.IgnoreArguments()
// not Repeat.Any to allow overriding the value
.Repeat.Times(int.MaxValue)
.WhenCalled(call => call.ReturnValue = myMethod.Invoke(original, call.Arguments))
.Return(CreateDefaultValue(myMethod.ReturnType));
}
}
mock.Replay();
}
private static object CreateDefaultValue(Type type)
{
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
else
{
return Convert.ChangeType(null, type);
}
}
}
Использование:
[TestClass]
public class TestClass()
{
[TestMethod]
public void Test()
{
var mock = MockRepository.GenerateMock<IList<int>>();
List<int> original = new List<int>();
mock.ForwardCalls(original);
mock.Add(7);
mock.Add(8);
Assert.AreEqual(2, mock.Count);
Assert.AreEqual(7, mock[0]);
Assert.AreEqual(8, mock[1]);
//fake Count after ForwardCalls, use Repeat.Any()
mock.Stub(x => x.Count)
.Return(88)
.Repeat.Any(); // repeat any needed to "override" value
// faked count
Assert.AreEqual(88, mock.Count);
}
}