2017-08-18 2 views
1

Als Teil eines Komponententests versuche ich einen Schein IOwinRequest zu erstellen, der HTTP-Formulardaten als seinen Körper enthält. Der betreffende Code arbeitet in der Produktion (ich kann die Formulardaten von Anfragen über einen Web-Browser gesendet erfolgreich gelesen), aber ich kann nicht verstehen, was ich falsch mache mit dem Unit-Test:Formulardaten an OwinRequest im Komponententest schreiben

[TestMethod] 
public async Task TestPostData() 
{ 
    String rawFormData = "test=testValue&test2=testValue2"; 
    MemoryStream stream = new MemoryStream(); 

    using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8, 4 * 1024, true)) 
     await writer.WriteAsync(rawFormData); 

    stream.Seek(0, SeekOrigin.Begin); 

    Mock<IOwinRequest> requestMock = new Mock<IOwinRequest>(); 
    requestMock.SetupGet(r => r.Method).Returns("POST"); 
    requestMock.SetupGet(r => r.Body).Returns(stream); 
    requestMock.SetupGet(r => r.ContentType).Returns("application/x-www-form-urlencoded"); 

    Assert.IsNotNull(await requestMock.Object.ReadFormAsync()); 
} 

Die Form Objekt, das von der ReadFormAsync-Methode zurückgegeben wird, ist null. Was vermisse ich? Dies ist auf. Net4.5 und Microsoft.Owin 3.0.1

+0

Wurde dies gelöst? – Nkosi

Antwort

0

Sie haben diese Methode nicht so eingerichtet, so würde es offensichtlich Null zurückgeben, wenn sie aufgerufen wird.

[TestMethod] 
public async Task _TestPostData() { 
    var dictionary = new Dictionary<string, string[]>() { 
     { "test", new[]{"testValue"}}, 
     { "test2", new[]{"testValue2"}}, 

    }; 
    String rawFormData = "test=testValue&test2=testValue2"; 
    var stream = new MemoryStream(); 

    using (var writer = new StreamWriter(stream, Encoding.UTF8, 4 * 1024, true)) 
     await writer.WriteAsync(rawFormData); 

    stream.Seek(0, SeekOrigin.Begin); 

    var formMock = new Mock<IFormCollection>(); 
    formMock.Setup(_ => _.GetEnumerator()).Returns(() => dictionary.GetEnumerator()); 
    var readableString = formMock.As<IReadableStringCollection>(); 
    //..setup as desired 

    var requestMock = new Mock<IOwinRequest>(); 
    requestMock.Setup(_ => _.Method).Returns("POST"); 
    requestMock.Setup(_ => _.Body).Returns(stream); 
    requestMock.Setup(_ => _.ContentType).Returns("application/x-www-form-urlencoded"); 
    requestMock.Setup(_ => _.ReadFormAsync()).ReturnsAsync(formMock.Object); 

    Assert.IsNotNull(await requestMock.Object.ReadFormAsync()); 
} 

Aber diese Frage scheint eine XY problem zu sein. Es gibt nicht viel mehr in Bezug auf das Setup, das ich in dieser Antwort bereitstellen kann.

Verwandte Themen