2013-02-09 11 views
7

साथ मैं इस सेवा की है। मैं यह जानना चाहता हूं कि इकाई परीक्षण कैसे करें। मैंने इस तरह एक परीक्षण लिखा:यूनिट टेस्ट HttpRequest हेडर ServiceStack

[TestFixture] 
public class PlayerServiceTests 
{ 
    AppHost appHost; 

    [TestFixtureSetUp] 
    public void TestFixtureSetUp() 
    { 
     appHost = new AppHost(); 
     appHost.Init(); 
     appHost.Start ("http://localhost:1337/"); 
    } 

    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     appHost.Dispose(); 
     appHost = null; 
    } 

    [Test] 
    public void NewPlayer_Should_Return201AndLocation() 
    { 
     // Arrange 
     PlayerService service = new PlayerService (appHost.TryResolve<IPlayerAppService>()); 

     // Act 
     HttpResult response = (HttpResult)service.Post (It.IsAny<PlayerDTO>()); 

     // Assert 
     Assert.NotNull (response); 
     Assert.AreEqual(HttpStatusCode.Created, response.StatusCode); 
     Assert.AreEqual(response.Response.ToDto<PlayerResponse>().Player.Id.ToString(), response.Headers.Where(x=> x.Key == HttpHeaders.Location).SingleOrDefault().Value); 
    } 
} 

आधार। जब मेरा यूनिट परीक्षण चलता है तो जांच करें। क्या आपके पास कोई सुझाव है कि मैं इसे अपने यूनिट परीक्षण से कैसे बना सकता हूं?

+0

भाषा? सी# ? – Dukeling

+0

हां :) मोनो डेवलपमेंट में विकसित किया गया। –

+2

उचित टैग जोड़ा गया। – Dukeling

उत्तर

12

आप एक आत्म-होस्टिंग एचटीपी लिस्टनर का उपयोग कर रहे हैं क्योंकि आप एकीकरण परीक्षण के लिए करेंगे, लेकिन आप एकीकरण परीक्षण में नहीं कर रहे हैं।

एक एकीकरण परीक्षण दिखाई देगा:

[Test] 
public void NewPlayer_Should_Return201AndLocation() 
{ 
    var client = new JsonServiceClient("http://localhost:1337/"); 
    client.LocalHttpWebResponseFilter = httpRes => { 
     //Test response headers... 
    }; 

    PlayerResponse response = client.Post(new Player { ... }); 
} 

अन्यथा यदि आप और एक इकाई परीक्षण आप एक AppHost की जरूरत नहीं है क्या करना चाहते हैं तो बस किसी भी अन्य सी # वर्ग की तरह PlayerService वर्ग परीक्षण कर सकते हैं, सभी इंजेक्शन निर्भरता और नकली अनुरोध संदर्भ की जरूरत है।

[Test] 
public void NewPlayer_Should_Return201AndLocation() 
{ 
    var mockCtx = new Mock<IRequestContext>(); 
    mockCtx.SetupGet (f => f.AbsoluteUri).Returns("localhost:1337/player"); 

    PlayerService service = new PlayerService { 
     MyOtherDependencies = new Mock<IMyOtherDeps>().Object, 
     RequestContext = mockCtx.Object, 
    }; 

    HttpResult response = (HttpResult)service.Post(new Player { ... }); 

    //Assert stuff.. 
} 
+0

आह! यह मेरे लिए नहीं हुआ था कि मैं इस नए xService {RequestContext = mockCtx.Object} की तरह अनुरोध कॉन्टेक्स्ट इंजेक्ट कर सकता था; धन्यवाद! –

+0

नोट: AbsoluteUri केवल पढ़ने के लिए है, इसलिए SetupProperty इस तरह काम नहीं करेगा। –

+0

मैं इस तरह की संपत्ति स्थापित करने में सक्षम था: mockCtx.SetupGet (f => f.AbsoluteUri)। पुनर्नवीनीकरण ("http: // localhost: 1337/player"); –

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