Используя nMoq, как можно ожидать от данного события? - PullRequest
2 голосов
/ 24 июля 2010

Допустим, я хочу провести юнит-тест, где у меня есть эта игра тетрис, и я хочу начать игру, ничего не делать и ждать окончания игры (то есть, чтобы получить событие GameOver):1001 *

Tetris tetris = new Tetris();
tetris.GameOver += something;
tetris.Start();

Как мне пройти тест?Это должно быть легко, но я не понимаю, как это сделать.Моей единственной идеей было бы что-то вроде:

Tetris tetris = new Tetris();
tetris.GameOver += delegate() { Assert.True(); };
tetris.Start();

Спасибо

Ответы [ 2 ]

1 голос
/ 24 июля 2010

Я написал небольшой вспомогательный класс, который мне нравится использовать.Вы можете найти класс здесь и модульные тесты для класса здесь .Вы можете использовать его, но используйте на свой страх и риск.Я использую его для своих тестов, но вполне возможно, что есть ошибки.Для вашего случая использование класса будет выглядеть следующим образом:

        Tetris tetris = new Tetris();
        using (EventAssertion.Raised(tetris, "GameOver").OnlyOnce().Go())
        {
            tetris.Start();
        }

РЕДАКТИРОВАТЬ: похоже, он также требует EmitHelpers .

1 голос
/ 24 июля 2010

Предполагая, что tetris.Start() является синхронным, вы можете подать сигнал в тест, используя обработчик событий:

Tetris tetris = new Tetris();
bool wasRaised = false;
tetris.GameOver += delegate() { wasRaised = true; };
tetris.Start();
Assert.IsTrue(wasRaised);

Если вызов асинхронный, вы должны синхронизировать вызов, чтобыAssert в контексте теста.

...