18

मैं इस तरह एक नियंत्रक के लिए एक इकाई परीक्षण लिख रहा हूँ:मॉडल राज्य मान्यता का परीक्षण करती है

public HttpResponseMessage PostLogin(LoginModel model) 
{ 
    if (!ModelState.IsValid) 
     return new HttpResponseMessage(HttpStatusCode.BadRequest); 
} 

मॉडल लगता है:

public class LoginModel 
{ 
    [Required] 
    public string Username { set; get; } 
    [Required] 
    public string Password { set; get; } 
} 

तो मैं इस तरह इकाई परीक्षण है:

[TestMethod] 
public void TestLogin_InvalidModel() 
{ 
    AccountController controller = CreateAccountController(); 

    ... 
    var response = controller.PostLogin(new LoginModel() { }); 

    Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); 

} 

वास्तव में मॉडलस्टेट मान्य है ... जो मेरे लिए अजीब है क्योंकि दोनों फ़ील्ड आवश्यक हैं ... कोई सलाह देता है?

उत्तर

23

मॉडल स्थिति मान्य होने का कारण यह है कि जब आप नियंत्रक को नया करते हैं तो एक नया मॉडल स्थिति बनाई जाती है। वेब एपीआई आपके लिए यहां पैरामीटर बाध्यकारी नहीं कर रहा है, इसलिए इसमें मॉडल स्थिति त्रुटियों को जोड़ने का मौका भी नहीं है।

यदि आप इसे यूनिट परीक्षण के रूप में रखना चाहते हैं, तो आपको मॉडल स्थिति त्रुटियों को स्वयं जोड़ना चाहिए और परीक्षण करना चाहिए कि क्या होता है।

आप परीक्षण करने के लिए है कि मॉडल राज्य कोई वास्तविक अनुरोध पर अमान्य होगा चाहते हैं, मैं सुझाव है कि आप इस ब्लॉग पोस्ट पढ़ें:

http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx

और एक में स्मृति सर्वर के विरुद्ध परीक्षण की कोशिश करो। आपके मामले के लिए एक मामूली नोट यह होगा कि आप यह सुनिश्चित करने के लिए ऑब्जेक्ट कंटेंट के बजाय स्ट्रिंगकंटेंट का उपयोग करना चाहें कि वेब एपीआई शरीर को उचित तरीके से खराब करने और बांधने की कोशिश करता है।

+2

+1 यूसुफ के साथ +1। साथ ही, आप अनुरोध पाइपलाइन के लिए निम्न वेब एपीआई पोस्टर पर एक नज़र डाल सकते हैं। http://www.asp.net/posters/web-api/ASP.NET-Web-API-Poster-grayscale.pdf –

16

टीएल; डीआर यदि आप यूसुफ द्वारा प्रदान किए गए पूरे लेख को नहीं पढ़ना चाहते हैं और मॉडलस्टेट बनाने के लिए त्वरित समाधान चाहते हैं। यह वैध झूठी वापसी है। यह करो।

[TestMethod] 
public void TestLogin_InvalidModel() 
{ 
    AccountController controller = CreateAccountController(); 
    // new code added --> 
    controller.ModelState.AddModelError("fakeError", "fakeError"); 
    // end of new code 
    ... 
    var response = controller.PostLogin(new LoginModel() { }); 

    Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); 

} 

अब मैं CreateAccountController() कल्पना कर सकते हैं कम से कम के लिए कुछ इस तरह दिखता ->

return new AccountApiController() 
{ 
    Request = new HttpRequestMessage(), 
    Configuration = new HttpConfiguration() 
}; 

आशा इस googling :)

+0

उदाहरण के लिए धन्यवाद। मेरे द्वारा किए गए एकमात्र अंतर पर जोर दिया गया था: Assert.IsInstanceOfType (actResult, typeof (InvalidModelStateResult)); –

1

लोगों के लिए एक त्वरित जवाब देता है जैसा कि पहले उल्लेख किया है, आप ModelState को प्रमाणित करने के लिए एकीकरण परीक्षण की आवश्यकता है। तो, Asp.Net कोर के साथ, मैं इस सवाल खुदाई कर रहा हूँ एक सरल उपाय ModelState

की और Asp.Net कोर के साथ परीक्षण सत्यापन एकीकृत

पैकेज Microsoft.AspNetCore.TestHost जोड़े के लिए जोड़ने के लिए और आप अनुरोध इस सरल प्रस्तुत कर सकते हैं:

var server = new TestServer(new WebHostBuilder().UseStartup<Startup>()); 
var client = server.CreateClient(); 
var model = new { Name = String.Empty }; 
var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"); 
var result = await client.PostAsync("/api/yourApiEndpoint", content); 
result.StatusCode.Should().Be(HttpStatusCode.BadRequest); 

आप यहाँ इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं: http://asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html

आशा है कि यह मदद करता है।

+0

यदि आप एक .NET कोर उत्तर की तलाश में हैं तो सही जवाब। – THBBFT

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