Тестирование в попытке поймать с Moq по сравнению с носороги носорога - PullRequest
1 голос
/ 05 марта 2010

Я только что работал над некоторыми тестами с использованием Moq, но столкнулся с проблемой, пытаясь протестировать метод, который я хотел вызвать дважды через блок try catch. Принцип заключается в том, что первый вызов вызывает исключение, затем в подвохе я исправляю проблему и снова вызываю метод.

Мне удалось сделать это с помощью Rhino Mocks, как показано ниже, но, будучи новичком в обеих платформах, я подумал, может ли кто-нибудь сказать мне, можно ли добиться того же с помощью Moq.

// C.U.T
public class Mockee
{
    bool theCatLives = true;

    public Mockee() { }

    public virtual void SetFalse()
    {
        theCatLives = false;
    }
}


[Test]
public void TestTryCatch(){

    var mr = new MockRepository();
    var mock = mr.StrictMock<Mockee>();
    mr.Record();
    Expect.Call(mock.SetFalse).Throw(new Exception());
    Expect.Call(mock.SetFalse);
    mr.ReplayAll();

    try
    {
        mock.SetFalse();
    }
    catch
    {
        mock.SetFalse();
    }

    mock.VerifyAllExpectations();
}

1 Ответ

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

Это не особенно легко сделать с Moq, поскольку в нем нет понятия упорядоченных ожиданий. Однако вы можете использовать метод Callback и генерировать исключения оттуда, например так:

var actions = new Queue<Action>(new Action[] 
{
    () => { throw new Exception(); },
    () => { } 
});

var mock = new Mock<Mockee>();
mock.Setup(m => m.SetFalse()).Callback(() => actions.Dequeue()()).Verifiable();

try
{
    mock.Object.SetFalse();
}
catch
{
    mock.Object.SetFalse();
}
mock.Verify();

Однако одно предостережение заключается в том, что эта версия проверяет, был ли вообще вызван метод SetFalse.

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

mock.Verify(m => m.SetFalse(), Times.Exactly(2));

Однако это слегка нарушает принцип СУХОГО, потому что вы бы указали один и тот же параметр дважды, но вы могли бы обойти это, сначала объявив и определив переменную типа Expression<Action<Mockee>> и использовав ее как для Setup, так и для Verify методы ...

...