2012-06-13 10 views
13

का उपयोग करके अपवादों के परीक्षण के लिए परीक्षण कैसे करें मैं अपने यूनिट परीक्षणों के लिए 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 विधि है।

लेकिन मैं इसे सब एक साथ कैसे रखूं?

अपवाद जिसे मैं परीक्षण करना चाहता हूं, तब सहेजना चाहिए जब सहेजें विधि कहा जाता है। तो मुझे लगता है कि मुझे एक आर्ट लपेटना चाहिए। प्रस्तुतकर्ता के चारों ओर तीर विधि। सेव() विधि कॉल, लेकिन मैंने प्रस्तुति को सोचा था। सेव विधि को .o (() => ...

में कॉल किया जाना चाहिए आपको सलाह कृपया अगर मेरी इकाई परीक्षण नीचे या कुछ और की तरह दिखना चाहिए?

"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()); 

बहुत धन्यवाद

+0

सुनिश्चित नहीं हैं कि इस मदद कर सकता है, लेकिन आप इसके अलावा इन कर रहे हैं उदाहरण के लिए https://bitbucket.org/johannesrudolph/subspec/src/a35fcc8ae1f6/test/SubSpec.Tests/ContextSetupTeardownBehavior.cs SubSpec पर दस्तावेज़ीकरण की जाँच की थी बीडीडी/विशिष्टता आधारित परीक्षण यूनिट टेस्ट नहीं। यदि आप टैग बीडीडी शामिल करते हैं तो आपको बेहतर दर्शक मिल सकते हैं। – Spock

उत्तर

6

मैं इस तरह यह करना होगा:

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

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

"expect an ValidationException to be thrown" 
    .Observation(() => 
     Assert.IsType<ValidationException>(exception) 
    ); 

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

या बेहतर अभी भी, xBehave.net के लिए स्विचन SubSpec और FluentAssertions शुरू: -

"Given an options presenter" 
    .x(() => presenter = new OptionsPresenter(view, (IOptionsModel)null, service)); 

"When saving the options presenter" 
    .x(() => exception = Record.Exception(() => presenter.Save())); 

"Then a validation exception is thrown" 
    .x(() => exception.Should().BeOfType<ValiationException>()); 

"And the options model must not be saved" 
    .x(() => A.CallTo(() => 
     service.SaveOptions(A<IOptionsModel>.Ignored)).MustNotHaveHappened()); 
10

मैं fakeItEasy या subSpec की नहीं सुना है (यदि आप परीक्षण बहुत अजीब लग रही है, तो मैं हो सकता है इन्हें जांचें :))। हालांकि, मैं प्रयोग करते हैं XUnit तो यह सहायक हो सकता है:

मैं Assert.ThrowsDelegate

साथ Record.Exception उपयोग करती हैं इसलिए की तरह कुछ: कि

[Fact] 
    public void Test() 
    { 
     // Arange 

     // Act 
     Exception ex = Record.Exception(new Assert.ThrowsDelegate(() => { service.DoStuff(); })); 

     // Assert 
     Assert.IsType(typeof(<whatever exception type you are looking for>), ex); 
     Assert.Equal("<whatever message text you are looking for>", ex.Message); 
    } 

आशा में मदद करता है।

2

यह एक तरीका है FakeItEasy में यह करने के लिए है।

Action act =() => someObject.SomeMethod(someArgument); 
act.ShouldThrow<Exception>(); 
+0

मुझे "एक्शन में कंधे के लिए परिभाषा नहीं है ..." मुझे क्या संदर्भ/असेंबली शामिल करने की आवश्यकता है? – unekwu

संबंधित मुद्दे