Я наконец смог добраться до компилятора и поиграть с кодом, и вот что я нашел. Это в основном то, что Джайлс сказал выше для своей первой части вопроса.
Вот подсказка кода для установки:
Определяет настройку по ложному типу для вызова метода, возвращающего значение.
И вот актуальный код для установки
public ISetup<T> Setup(Expression<Action<T>> expression)
Итак, программа установки на самом деле устанавливает код как действие (делегат, в основном). Когда запускается тестовый прогон, он достигает этой точки и обычно ожидает передачи делегата методу Returns
public IReturnsResult<TMock> Returns(TResult value)
Итак, этого никогда не делается, и вместо того, чтобы Mock пробежал весь ожидаемый путь и согласовал весь код, он возвращает неверные значения.
Ооо, это в основном то, где объяснение Джайлса является правильным. Если вы проверяете, что вызывается метод do_work, то вы хотите использовать Verify
(который действительно использует ваш поддельный объект в качестве макета). Однако, если нет, то вам не нужно даже настраивать это, поскольку это ничего не делает. Если это так, то, возможно, этот фрагмент кода не должен находиться в этом конкретном блоке кода, но вам лучше это оценить.
И, наконец, метод Setup следует использовать только в том случае, если вы действительно используете свой объект в качестве заглушки, просто используя его для внедрения логики в ваш код.
Надеюсь, это имеет смысл и поможет вам решить вашу проблему.
Кроме того, Callback
может пригодиться здесь в зависимости от того, что вы делаете. Но я не уверен. У них есть много примеров в Moq quickstart
ОБНОВЛЕНИЕ ДЛЯ МОЕЙ ПОПЫТКИ ПРИ ВОССТАНОВЛЕНИИ с использованием версии 4.0.10827 ... и не было проблем
[Test]
public void teststuff()
{
Mock<MyTestObj> myTestObj_mock = new Mock<MyTestObj>();
myTestObj_mock.Setup(e => e.do_work(It.IsAny<AnObject>()));
AnObject tester = new AnObject();
tester.anAction(myTestObj_mock.Object);
}
...
public class MyTestObj
{
public virtual void do_work(AnObject o)
{
}
}
public class AnObject
{
public void anAction(MyTestObj obj)
{
obj.do_work(new AnObject());
}
}