У меня есть кусок кода, который я не могу изменить. В идеале я бы переместил метод Publish в другой класс. Насмешка станет тривиальной операцией, и я буду в порядке. Вот упрощенный пример.
public class Entity
{
private IController _controller;
// Omitted: Constructor where IController is assigned
public virtual int Process()
{
return Publish(_controller.DoSomeStuff());
}
public virtual int Publish(int val)
{
Console.WriteLine(val); // This is actually a call to an external system.
return val;
}
}
То, что я хочу сделать, это вызвать реальный Процесс метод и поддельный Публикация метод. Значение _controller также будет проверено.
Я пытался использовать moq и делал:
var mock = new Mock<IController>();
mock.Setup(m => m.DoSomeStuff()).Returns(11);
var mock2 = new Mock<Entity_Accessor>();
mock2.CallBase = true;
mock2.Setup(a => a.Publish(It.IsAny<int>())).Returns(999);
mock2.Object._controller = mock.Object;
int result = mock2.Object.Process();
Assert.AreEqual(999, result);
Когда я запускаю этот тест, вместо 999 возвращается значение 11. Если я удаляю mock2.CallBase = true, весь класс будет mocked, который возвращает значения по умолчанию для каждой функции.
Возможно ли в этом случае просто смоделировать метод Publish, сохранив первоначальную реализацию Process?
Можно ли достичь вышеизложенного с помощью другой среды для насмешек, отличной от Typemock или Justmock (не уверен, что клиент заплатит за несколько копий насмешливого инструмента)?
Спасибо!