Скорее всего так:
[Test]
public void Test()
{
// Arrange
ISth sth= MockRepository.GenerateMock<ISth>();
sth
.Stub(x => x.A())
.Return("sth");
// Act
FunctionBeingTested(sth);
// Assert
}
Чтобы по-настоящему воспользоваться новым синтаксисом AAA, вам нужно немного передумать. Я пытаюсь объяснить.
В моем предложении есть существенное различие: здесь нет "Expect-Verify". Поэтому я предлагаю не ожидать вызова, потому что есть возвращаемое значение. Я предполагаю, что метод не может пройти тест, когда он не вызвал sth.A
, потому что он пропустит правильное возвращаемое значение. Это потерпит неудачу, по крайней мере, один из других утверждает.
Это на самом деле хорошая вещь.
- вы можете переместить заглушку в TestInitialize, это не повредит, если заглушенный метод не вызывается в тесте (это не ожидание). Ваши тесты станут короче.
- Ваш тест не знает, "как" работает тестируемая система, вы только проверяете результаты. Ваши тесты станут более понятными.
Есть еще один сценарий, в котором вам действительно нужно проверить, был ли вызван метод на макете. Главным образом, если он возвращает void. Например: событие должно было быть запущено, транзакция совершена и так далее. Для этого используйте AssertWasCalled
:
[Test]
public void Test()
{
// Arrange
ISth sth= MockRepository.GenerateMock<ISth>();
// Act
FunctionBeingTested(sth);
// Assert
sth
.AssertWasCalled(x => x.A());
}
Примечание: нет возвращаемого значения, поэтому нет заглушки. Это идеальный случай. Конечно, вы могли бы иметь, Stub
и AssertWasCalled
.
Существует также Expect
и VerifyAllExpectations
, которые фактически ведут себя как старый синтаксис. Я бы использовал их только тогда, когда вам нужны Stub
и AssertWasCalled
в одном и том же тесте, и у вас есть ограничения полных аргументов, которые вы не хотите писать дважды. Обычно избегают Expect
и VerifyAllExpectations