Rhino Mocks DynamicMultiMock - установка ожидания с возвращаемым значением на дополнительном интерфейсе - PullRequest
2 голосов
/ 11 марта 2010

Я создаю DynamicMultiMock следующим образом:

this.serviceClient = this.mocks.DynamicMultiMock<ISlippyPlateProcedureService>(typeof(ICommunicationObject));

Затем устанавливаю следующее ожидание:

Expect.Call(((ICommunicationObject)this.serviceClient).State).Return(CommunicationState.Faulted);

Когда я выполняю тест, Rhino Mocks сообщает об этом:
Воспроизведеноожидание: ICommunicationObject.get_State ();
Динамический макет: неожиданный вызов метода игнорируется: ICommunicationObject.get_State ();

Правильно ли я устанавливаю это ожидание или есть другой способ?

Редактированиевключить полный код теста:

        Expect.Call(this.syncContextContainer.SynchronizationContext).Return(new SlippyPlateProcedureSynchronizationContextMock());
        Expect.Call(this.clientFactory.CreateServiceClient(null)).IgnoreArguments().Return(this.serviceClient);
        Expect.Call(((ICommunicationObject)this.serviceClient).State).Return(CommunicationState.Faulted);
        Expect.Call(() => this.serviceClient.IsAlive());
        this.mocks.ReplayAll();
        SlippyPlateProcedureClient client = new SlippyPlateProcedureClient(
            this.syncContextContainer, this.clientFactory, this.container);
        PrivateObject privateObject = new PrivateObject(client);
        SlippyPlateProcedureClient_Accessor target = new SlippyPlateProcedureClient_Accessor(privateObject);

        target.CheckServerConnectivity();

        this.mocks.VerifyAll();

Спасибо

Андрей

1 Ответ

2 голосов
/ 12 марта 2010

Трудно сказать, что происходит, не видя ваш производственный код. Следующий тест проходит:

public interface IA
    {
        int A(int a);
    }

    public interface IB
    {
        int B(int b);
    }

    [Test]
    public void Multimocks()
    {
        MockRepository mocks = new MockRepository();
        IA mymock = mocks.DynamicMultiMock<IA>(typeof (IB));
        Expect.Call(mymock.A(1)).Return(2);
        Expect.Call(((IB)mymock).B(3)).Return(4);
        mocks.ReplayAll();

        Assert.AreEqual(2, mymock.A(1));
        Assert.AreEqual(4, ((IB)mymock).B(3));
    }

, что означает, что мультимоки работают правильно. Вы уверены, что не звоните в штат более одного раза? Попробуйте изменить макеты на StrictMocks (вы получите исключение, когда вызовы не ожидаются), поэтому:

this.serviceClient = this.mocks.StrictMultiMock<ISlippyPlateProcedureService>(typeof(ICommunicationObject));

и пусть свойство будет прочитано несколько раз:

Expect.Call(((ICommunicationObject)this.serviceClient).State).Return(CommunicationState.Faulted).Repeat.Any();

Дайте мне знать, каковы ваши успехи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...