XUnit का उपयोग कर एक अपवाद का दावा करें


111

मैं XUnit और Moq का नौसिखिया हूं। मेरे पास एक विधि है जो एक तर्क के रूप में स्ट्रिंग लेती है। XUnit का उपयोग करके एक अपवाद को संभालने के लिए कैसे।

[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() {
    //arrange
    ProfileRepository profiles = new ProfileRepository();
    //act
    var result = profiles.GetSettingsForUserID("");
    //assert
    //The below statement is not working as expected.
    Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));
}

परीक्षण के तहत विधि

public IEnumerable<Setting> GetSettingsForUserID(string userid)
{            
    if (string.IsNullOrWhiteSpace(userid)) throw new ArgumentException("User Id Cannot be null");
    var s = profiles.Where(e => e.UserID == userid).SelectMany(e => e.Settings);
    return s;
}

1
"उम्मीद के अनुसार काम नहीं कर रहा है" से आपका क्या मतलब है? (इसके अलावा, कृपया अपने कोड को और अधिक आसानी से प्रारूपित करें। पूर्वावलोकन का उपयोग करें, और पोस्ट करें कि जब आप इसे पढ़ रहे हैं तो यह देखना चाहते हैं कि आप इसे कैसे देखना चाहते हैं।)
जॉन स्कीट

4
सुझाव: आप कॉल GetSettingsForUserID("")करना शुरू करने से पहले फोन कर रहे हैं Assert.ThrowsAssert.Throwsकॉल तुम वहाँ मदद नहीं कर सकता। मैं AAA के बारे में कम कठोर होने का सुझाव देता हूं ...
जॉन स्कीट

जवाबों:


183

Assert.Throws अभिव्यक्ति अपवाद को पकड़ने और प्रकार पर जोर होगा। आप फिर भी मुखर अभिव्यक्ति के बाहर परीक्षण के तहत विधि को बुला रहे हैं और इस प्रकार परीक्षण मामले को विफल कर रहे हैं।

[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException()
{
    //arrange
    ProfileRepository profiles = new ProfileRepository();
    // act & assert
    Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID(""));
}

यदि एएए का अनुसरण करने पर तुली हो तो आप कार्रवाई को अपने चर में निकाल सकते हैं।

[Fact]
public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException()
{
    //arrange
    ProfileRepository profiles = new ProfileRepository();
    //act
    Action act = () => profiles.GetSettingsForUserID("");
    //assert
    var exception = Assert.Throws<ArgumentException>(act);
    //The thrown exception can be used for even more detailed assertions.
    Assert.Equal("expected error message here", exception.Message);
}

ध्यान दें कि अपवाद का उपयोग मोड विस्तृत अभिकथन के लिए भी किया जा सकता है


5
यदि Async विधियों का उपयोग किया जाता है, तो Visual Studio उपरोक्त सिंटैक्स के साथ चेतावनी फेंकता है। यह इसे पसंद करता है:async Task act() => await service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);
एलेक

5
वास्तव में मेरे लिए जो एक त्रुटि थी, 'कार्य को कथित रूप से फंक को <टास्क>' में परिवर्तित नहीं किया जा सकता है, जबकि अगर मैं अभी लगाता हूं Task act() => service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);तो यह इससे खुश है और ठीक काम करता है।
एलेक

कैसे async के साथ काम करता है / यह प्रभाव का इंतजार है? जब मैं अपने परीक्षण में थ्रोएर्ससिन का उपयोग करके यह करने की कोशिश करता हूं तो यह कभी भी Assert.Equal लाइन तक नहीं पहुंचता है क्योंकि यह सफलतापूर्वक त्रुटि फेंकता है और परीक्षण को समाप्त करता है। पानी का परीक्षण यह देखने के लिए कि क्या यह एक नया प्रश्न होना चाहिए ...
nathanjw

@AlecDenholm धन्यवाद! बस यही एक चीज है जो मेरे लिए काम करती है। मुझे लगता है कि कुछ अन्य सुझाव वास्तव में async सामान के लिए ठीक से काम नहीं करते हैं।
ट्रेडमार्क

45

यदि आप AAA के बारे में कठोर होना चाहते हैं तो आप अपने एक्ट चरण में अपवाद को पकड़ने के लिए xUnit से Record.Exception का उपयोग कर सकते हैं ।

फिर आप Assert चरण में कैप्चर किए गए अपवाद के आधार पर दावे कर सकते हैं।

इसका एक उदाहरण xUnits परीक्षणों में देखा जा सकता है ।

[Fact]
public void Exception()
{
    Action testCode = () => { throw new InvalidOperationException(); };

    var ex = Record.Exception(testCode);

    Assert.NotNull(ex);
    Assert.IsType<InvalidOperationException>(ex);
}

यह आप पर निर्भर है कि आप किस रास्ते पर चलना चाहते हैं, और दोनों पथ पूरी तरह से समर्थित हैं जो xUnit प्रदान करता है।


1
FWIW, यह समाधान बहुत अच्छा है अगर आपको अपवाद संदेश को मान्य करने की आवश्यकता है, आदि मुझे लगता है कि जब आप Record.Exception का उपयोग कर सकते हैं।
जेफ लाफे

@JeffLaFay मैं सराहना करता हूं कि मैं यहां पार्टी के लिए थोड़ा लेट हो गया हूं, यह कैसे उपयोग करने var exception = Assert.Throws<InvalidOperationException>(testCode);और बोलने पर अलग होगा exception.Message? या यह एक ही चीज़ को प्राप्त करने का सिर्फ एक और स्वाद है?
ColinM

3

यदि आप AAA से चिपके रहना चाहते हैं तो आप कुछ इस तरह से विचार कर सकते हैं:

// Act 
Task act() => handler.Handle(request);

// Assert
await Assert.ThrowsAsync<MyExpectedException>(act);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.