Почему в моем частичном макете все виртуальные методы проверяются, даже если ожидания не установлены? - PullRequest
2 голосов
/ 30 апреля 2009

У меня есть пользовательский элемент управления, который выполняет некоторую проверку в методе 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 ]

5 голосов
/ 30 апреля 2009

Если вы смоделируете объект, он переопределит все абстрактные / виртуальные методы независимо от типа макета. Однако вы можете рассчитывать на свой метод и сказать ему, чтобы он выполнял исходный метод, который он переопределяет, используя:

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();
}
0 голосов
/ 30 апреля 2009

Хорошо, после некоторой дополнительной игры (возможно, просто запись проблемы помогла мне более четко обдумать это) Я думаю, что нашел решение.

кажется, что мне нужно позвонить:

RhinoMocksExtensions.Replay (foo);

прежде чем я позвоню

Assert.IsTrue (foo.Method2 ());

Возможно, ложные высказывания носорога должны быть явно указаны при использовании виртуальных методов, а не при установлении ожиданий. Не уверен почему. Если кто-нибудь знает причину этого, я хотел бы знать.

Во всяком случае, все работает, такие счастливые дни.

...