gtest - убедитесь, что метод не вызывается раньше, но может вызываться после определенного вызова метода - PullRequest
1 голос
/ 16 апреля 2019

Как я могу проверить, что метод setState() не вызывается до subscribe(), при этом разрешая, но не заставляя его вызываться после?

Код ниже показывает, чего я хочу достичь.

Это метод, который я хочу проверить:

...

void FirstState::enter()
{
    mInfoSubscription.subscribe(mInfoListener);

    mStateMachine.setState(mFactory.makeState(StateId::SecondState));
}

...

Это юнит-тест:

class FirstStateTest : public ::testing::Test {
protected:
    FirstStateTest()
        : mFirstState{mMockStateMachine, mMockStatesFactory,
                      mMockInfoSubscription, mMockInfoListener}
    {
    }

    NiceMock<MockStateMachine> mMockStateMachine;
    NiceMock<MockStatesFactory> mMockStatesFactory;
    NiceMock<MockInfoSubscription> mMockInfoSubscription;
    NiceMock<MockInfoListener> mMockInfoListener;

    FirstState mFirstState;
};

TEST_F(FirstStateTest, ensure_that_subscription_is_done_before_state_change)
{
    // This method must not be called before "subscribe()".
    EXPECT_CALL(mMockStateMachine, doSetState(_)).Times(0);  // doesn't work the way I want

    EXPECT_CALL(mMockInfoSubscription, subscribe(_)).Times(1);

    // At this moment it doesn't matter if this method is called or not.
    EXPECT_CALL(mMockStateMachine, doSetState(_)).Times(AtLeast(0));  // doesn't work the way I want

    mFirstState.enter();
}

// other unit tests ...
...

Редактировать 1:

На всякий случай, вот как MockStateMachine выглядит:

class MockStateMachine : public IStateMachine {
public:
    MOCK_METHOD1(doSetState, void(IState* newState));
    void setState(std::unique_ptr<IState> newState) { doSetState(newState.get()); }
};

1 Ответ

2 голосов
/ 17 апреля 2019

Вы можете использовать ::testing::InSequence, чтобы гарантировать, что ожидаемые вызовы в порядке.

TEST_F(FirstStateTest, ensure_that_subscription_is_done_before_state_change) {
  InSequence expect_calls_in_order;

  // `subscribe` must be called first.
  EXPECT_CALL(mMockInfoSubscription, subscribe(_)).Times(1);

  // After the `subscribe` call, expect any number of SetState calls.
  EXPECT_CALL(mMockStateMachine, doSetState(_)).Times(AtLeast(0));

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