Я использую 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));
Но теперь я хочу написать несколько отрицательных модульных тестов и проверить, что определенные методы не вызываются и возникает исключение.
e.g.
"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(() => ...
Не могли бы вы посоветовать, должен ли мой модульный тест выглядеть так, как показано ниже, или как-то иначе?
"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());
Большое спасибо