Как проверять исключения с помощью xUnit, SubSpec и FakeItEasy

Я использую xUnit, SubSpec и FakeItEasy для своих модульных тестов. На данный момент я создал несколько положительных модульных тестов, таких как следующие:

"Given a Options presenter"
    .Context(() =>
        presenter = new OptionsPresenter(view,
                                         A<IOptionsModel>.Ignored,
                                         service));

"with the Initialize method called to retrieve the option values"
    .Do(() => 
        presenter.Initialize());

"expect the view not to be null"
    .Observation(() =>
        Assert.NotNull(view));

"expect the view AutoSave property to be true"
    .Observation(() => Assert.True(view.AutoSave));

Но теперь я хочу написать несколько отрицательных модульных тестов и проверить, что определенные методы не вызываются и не генерируется исключение

, например.

"Given a Options presenter"
    .Context(() =>
        presenter = new OptionsPresenter(view,
                                         A<IOptionsModel>.Ignored,
                                         service));

"with the Save method called to save the option values"
    .Do(() => 
        presenter.Save());

"expect an ValidationException to be thrown"
    .Observation(() =>
        // TODO 
     );

"expect an service.SaveOptions method not to be called"
    .Observation(() =>
        // TODO 
     );

Я вижу, что у FakeItEasy есть метод расширения MustNotHaveHappened, а у xUnit есть метод Assert.Throws.

Но как мне все это собрать?

Исключение, которое я хочу проверить, должно возникать при вызове метода Save. Итак, я предполагаю, что мне следует обернуть метод Assert.Throws вокруг вызова метода Presenter.Save(), но я думал, что метод Presenter.Save должен вызываться в .Do(() => ...

Can подскажите, должен ли мой юнит-тест выглядеть так, как показано ниже, или как-то иначе?

"Given a Options presenter"
    .Context(() =>    
        presenter = new OptionsPresenter(view,
                                         model,
                                         service));

"expect the Presenter.Save call to throw an Exception"
    .Observation(() =>
        Assert.Throws<FluentValidation.ValidationException>(() => presenter.Save()));

"expect the Service.SaveOptions method not to be called"
    .Observation(() =>
        A.CallTo(() => service.SaveOptions(A<IOptionsModel>.Ignored)).MustNotHaveHappened());

Большое спасибо

14
задан Spock 11 December 2012 в 09:57
поделиться