Почему в моем частичном макете высмеиваются все виртуальные методы, даже если никаких ожиданий не установлено?

StackOverflow https://stackoverflow.com/questions/806073

Вопрос

У меня есть пользовательский элемент управления, который выполняет некоторую проверку метода 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top