Używam xUnit, SubSpec i FakeItEasy do moich testów jednostkowych. mam tak daleko stworzył pewne pozytywne testy jednostkowe tak:Jak testować wyjątki wyrzucane przy użyciu xUnit, SubSpec i 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));
Ale teraz chcę napisać kilka negatywnych testów jednostkowych i sprawdzić, że niektóre metody nie sprawdzony i jest wyjątek
np.
"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
);
widzę FakeItEasy ma metodę rozszerzenia MustNotHaveHappened i xUnit ma metodę Assert.Throws.
Ale jak mogę to wszystko połączyć?
Wyjątek, który chcę przetestować, powinien wystąpić po wywołaniu metody Save. Zgaduję więc, że powinienem owinąć metodę Assert.Throws wokół wywołania metody presenter.Save(), ale myślałem, że metoda presenter.Save powinna zostać wywołana w .Do (() => ...
może pan doradzić jeśli testy jednostkowe powinny wyglądać jak poniżej lub coś innego?
"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());
Dziękujemy
Nie wiesz, że to może pomóc, ale sprawdzić dokumentację SubSpec na przykład https://bitbucket.org/johannesrudolph/subspec/src/a35fcc8ae1f6/test/SubSpec.Tests/ContextSetupTeardownBehavior.cs także są BDD/testy oparte na specyfikacji, a nie testy jednostkowe. Możesz uzyskać lepszą widownię, jeśli umieścisz tag BDD. – Spock