Почему в моем частичном макете высмеиваются все виртуальные методы, даже если никаких ожиданий не установлено?
-
03-07-2019 - |
Вопрос
У меня есть пользовательский элемент управления, который выполняет некоторую проверку метода ValidateChildren, который я хотел бы протестировать.Я создал частичную имитацию пользовательского элемента управления, но, хотя я не устанавливаю никаких ожиданий в отношении метода ValidateChildren, я просто вызываю его, он просто пропускается, и код внутри метода никогда не выполняется.Чтобы попытаться понять, что происходит, я создал простой тест, например:
public class Foo
{
public virtual bool Method1()
{
throw new NotImplementedException();
}
public virtual bool Method2()
{
return Method1();
}
}
и используйте это, чтобы проверить это:
[Test]
public void TestFooMethods ()
{
MockRepository m = new MockRepository();
Foo foo = m.PartialMock<Foo>();
RhinoMocksExtensions.Expect<Foo,bool>(
foo,
delegate (Foo obj)
{
return obj.Method1();
}
).Return(true);
Assert.IsTrue (foo.Method2());
}
теперь я ожидаю, что foo.Method1 будет высмеян, а foo.Method2 - нет.Но это всегда возвращает false, и если я попытаюсь пройти в отладчике, foo.Method2() будет перейден, и я не смогу к нему подключиться.
Есть идеи, почему?
Решение 2
Хорошо, после некоторых дополнительных экспериментов (возможно, простое запись проблемы помогло мне более четко о ней подумать), я думаю, что нашел решение.
кажется, мне нужно позвонить:
RhinoMocksExtensions.Replay (foo);
прежде чем я позвоню
Assert.IsTrue (foo.Method2 ());
Возможно, насмешкам Rhino нужно явно сообщать, когда используются виртуальные методы, а не создавать ожидания.Не знаю почему.Если кто-нибудь знает причину этого, я хотел бы знать.
В любом случае, кажется, все работает, так что счастливых дней.
Другие советы
Если вы издеваетесь над объектом, он переопределяет все абстрактные/виртуальные методы независимо от типа макета.Однако вы можете ожидать от своего метода и приказать ему выполнить исходный метод, который он переопределяет, используя:
CallOriginalMethod(OriginalCallOptions.CreateExpectation);
Вы используете Rhino Mocks не так, как это было задумано, что также может вызвать у вас проблемы.Я переписал ваш тест так, как он должен быть написан, используя C# 3.0, а также лямбда-методы и методы расширения:
[TestMethod]
public void TestFooMethods()
{
//Generate a new Mock to test against
Foo foo = MockRepository.GenerateMock<Foo>();
//Expect a call to Method1 on object foo and return true
foo.Expect(f => f.Method1()).Return(true);
//Expect a call to Method2 on object foo and call the original method
foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation);
Assert.IsTrue(foo.Method2());
//Verify all our expectations on foo
foo.VerifyAllExpectations();
}