How to do an integration test on my Asp.Net core web api endpoint where I upload a file?












-1














I am writing an integration test that tests the upload of a file to one of my endpoints and checks if the request result is correct!



I am using IFormFile in my controller to receive the request, but I am getting a 400 Bad request because apparently my file is null.



How do I allow an integration test to send a file to my endpoint? I found this post but that only talks about mocking IFormFile, not an integration test.





My controller:



[HttpPost]
public async Task<IActionResult> AddFile(IFormFile file)
{
if (file== null)
{
return StatusCode(400, "A file must be supplied");
}

// ... code that does stuff with the file..

return CreatedAtAction("downloadFile", new { id = MADE_UP_ID }, { MADE_UP_ID };
}


My integration test:



public class IntegrationTest:
IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly CustomWebApplicationFactory<Startup> _factory;

public IntegrationTest(CustomWebApplicationFactory<Startup> factory)
{
_factory = factory;
}

[Fact]
public async Task UploadFileTest()
{
// Arrange
var expectedContent = "1";
var expectedContentType = "application/json; charset=utf-8";

var url = "api/bijlages";
var client = _factory.CreateClient();

// Act
var file = System.IO.File.OpenRead(@"C:file.pdf");
HttpContent fileStreamContent = new StreamContent(file);

var formData = new MultipartFormDataContent
{
{ fileStreamContent, "file.pdf", "file.pdf" }
};

var response = await client.PostAsync(url, formData);

fileStreamContent.Dispose();
formData.Dispose();

response.EnsureSuccessStatusCode();

var responseString = await response.Content.ReadAsStringAsync();

// Assert
Assert.NotEmpty(responseString);
Assert.Equal(expectedContent, responseString);
Assert.Equal(expectedContentType, response.Content.Headers.ContentType.ToString());
}


I hope you guys can help me (and possibly others!) out here!










share|improve this question






















  • The referenced link was more an isolated unit test as apposed to an integration test
    – Nkosi
    Nov 23 '18 at 17:48










  • Take a look at how content is constructed here stackoverflow.com/a/42216413/5233410
    – Nkosi
    Nov 23 '18 at 17:55










  • MultipartFormDataContent can sometimes be a little tricky to send correctly
    – Nkosi
    Nov 23 '18 at 18:02










  • can you use a tool like Fiddler and check what is actually the being posted?
    – Leonardo
    Nov 23 '18 at 18:07
















-1














I am writing an integration test that tests the upload of a file to one of my endpoints and checks if the request result is correct!



I am using IFormFile in my controller to receive the request, but I am getting a 400 Bad request because apparently my file is null.



How do I allow an integration test to send a file to my endpoint? I found this post but that only talks about mocking IFormFile, not an integration test.





My controller:



[HttpPost]
public async Task<IActionResult> AddFile(IFormFile file)
{
if (file== null)
{
return StatusCode(400, "A file must be supplied");
}

// ... code that does stuff with the file..

return CreatedAtAction("downloadFile", new { id = MADE_UP_ID }, { MADE_UP_ID };
}


My integration test:



public class IntegrationTest:
IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly CustomWebApplicationFactory<Startup> _factory;

public IntegrationTest(CustomWebApplicationFactory<Startup> factory)
{
_factory = factory;
}

[Fact]
public async Task UploadFileTest()
{
// Arrange
var expectedContent = "1";
var expectedContentType = "application/json; charset=utf-8";

var url = "api/bijlages";
var client = _factory.CreateClient();

// Act
var file = System.IO.File.OpenRead(@"C:file.pdf");
HttpContent fileStreamContent = new StreamContent(file);

var formData = new MultipartFormDataContent
{
{ fileStreamContent, "file.pdf", "file.pdf" }
};

var response = await client.PostAsync(url, formData);

fileStreamContent.Dispose();
formData.Dispose();

response.EnsureSuccessStatusCode();

var responseString = await response.Content.ReadAsStringAsync();

// Assert
Assert.NotEmpty(responseString);
Assert.Equal(expectedContent, responseString);
Assert.Equal(expectedContentType, response.Content.Headers.ContentType.ToString());
}


I hope you guys can help me (and possibly others!) out here!










share|improve this question






















  • The referenced link was more an isolated unit test as apposed to an integration test
    – Nkosi
    Nov 23 '18 at 17:48










  • Take a look at how content is constructed here stackoverflow.com/a/42216413/5233410
    – Nkosi
    Nov 23 '18 at 17:55










  • MultipartFormDataContent can sometimes be a little tricky to send correctly
    – Nkosi
    Nov 23 '18 at 18:02










  • can you use a tool like Fiddler and check what is actually the being posted?
    – Leonardo
    Nov 23 '18 at 18:07














-1












-1








-1


1





I am writing an integration test that tests the upload of a file to one of my endpoints and checks if the request result is correct!



I am using IFormFile in my controller to receive the request, but I am getting a 400 Bad request because apparently my file is null.



How do I allow an integration test to send a file to my endpoint? I found this post but that only talks about mocking IFormFile, not an integration test.





My controller:



[HttpPost]
public async Task<IActionResult> AddFile(IFormFile file)
{
if (file== null)
{
return StatusCode(400, "A file must be supplied");
}

// ... code that does stuff with the file..

return CreatedAtAction("downloadFile", new { id = MADE_UP_ID }, { MADE_UP_ID };
}


My integration test:



public class IntegrationTest:
IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly CustomWebApplicationFactory<Startup> _factory;

public IntegrationTest(CustomWebApplicationFactory<Startup> factory)
{
_factory = factory;
}

[Fact]
public async Task UploadFileTest()
{
// Arrange
var expectedContent = "1";
var expectedContentType = "application/json; charset=utf-8";

var url = "api/bijlages";
var client = _factory.CreateClient();

// Act
var file = System.IO.File.OpenRead(@"C:file.pdf");
HttpContent fileStreamContent = new StreamContent(file);

var formData = new MultipartFormDataContent
{
{ fileStreamContent, "file.pdf", "file.pdf" }
};

var response = await client.PostAsync(url, formData);

fileStreamContent.Dispose();
formData.Dispose();

response.EnsureSuccessStatusCode();

var responseString = await response.Content.ReadAsStringAsync();

// Assert
Assert.NotEmpty(responseString);
Assert.Equal(expectedContent, responseString);
Assert.Equal(expectedContentType, response.Content.Headers.ContentType.ToString());
}


I hope you guys can help me (and possibly others!) out here!










share|improve this question













I am writing an integration test that tests the upload of a file to one of my endpoints and checks if the request result is correct!



I am using IFormFile in my controller to receive the request, but I am getting a 400 Bad request because apparently my file is null.



How do I allow an integration test to send a file to my endpoint? I found this post but that only talks about mocking IFormFile, not an integration test.





My controller:



[HttpPost]
public async Task<IActionResult> AddFile(IFormFile file)
{
if (file== null)
{
return StatusCode(400, "A file must be supplied");
}

// ... code that does stuff with the file..

return CreatedAtAction("downloadFile", new { id = MADE_UP_ID }, { MADE_UP_ID };
}


My integration test:



public class IntegrationTest:
IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly CustomWebApplicationFactory<Startup> _factory;

public IntegrationTest(CustomWebApplicationFactory<Startup> factory)
{
_factory = factory;
}

[Fact]
public async Task UploadFileTest()
{
// Arrange
var expectedContent = "1";
var expectedContentType = "application/json; charset=utf-8";

var url = "api/bijlages";
var client = _factory.CreateClient();

// Act
var file = System.IO.File.OpenRead(@"C:file.pdf");
HttpContent fileStreamContent = new StreamContent(file);

var formData = new MultipartFormDataContent
{
{ fileStreamContent, "file.pdf", "file.pdf" }
};

var response = await client.PostAsync(url, formData);

fileStreamContent.Dispose();
formData.Dispose();

response.EnsureSuccessStatusCode();

var responseString = await response.Content.ReadAsStringAsync();

// Assert
Assert.NotEmpty(responseString);
Assert.Equal(expectedContent, responseString);
Assert.Equal(expectedContentType, response.Content.Headers.ContentType.ToString());
}


I hope you guys can help me (and possibly others!) out here!







c# testing asp.net-core integration-testing






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 17:36









S. ten Brinke

365418




365418












  • The referenced link was more an isolated unit test as apposed to an integration test
    – Nkosi
    Nov 23 '18 at 17:48










  • Take a look at how content is constructed here stackoverflow.com/a/42216413/5233410
    – Nkosi
    Nov 23 '18 at 17:55










  • MultipartFormDataContent can sometimes be a little tricky to send correctly
    – Nkosi
    Nov 23 '18 at 18:02










  • can you use a tool like Fiddler and check what is actually the being posted?
    – Leonardo
    Nov 23 '18 at 18:07


















  • The referenced link was more an isolated unit test as apposed to an integration test
    – Nkosi
    Nov 23 '18 at 17:48










  • Take a look at how content is constructed here stackoverflow.com/a/42216413/5233410
    – Nkosi
    Nov 23 '18 at 17:55










  • MultipartFormDataContent can sometimes be a little tricky to send correctly
    – Nkosi
    Nov 23 '18 at 18:02










  • can you use a tool like Fiddler and check what is actually the being posted?
    – Leonardo
    Nov 23 '18 at 18:07
















The referenced link was more an isolated unit test as apposed to an integration test
– Nkosi
Nov 23 '18 at 17:48




The referenced link was more an isolated unit test as apposed to an integration test
– Nkosi
Nov 23 '18 at 17:48












Take a look at how content is constructed here stackoverflow.com/a/42216413/5233410
– Nkosi
Nov 23 '18 at 17:55




Take a look at how content is constructed here stackoverflow.com/a/42216413/5233410
– Nkosi
Nov 23 '18 at 17:55












MultipartFormDataContent can sometimes be a little tricky to send correctly
– Nkosi
Nov 23 '18 at 18:02




MultipartFormDataContent can sometimes be a little tricky to send correctly
– Nkosi
Nov 23 '18 at 18:02












can you use a tool like Fiddler and check what is actually the being posted?
– Leonardo
Nov 23 '18 at 18:07




can you use a tool like Fiddler and check what is actually the being posted?
– Leonardo
Nov 23 '18 at 18:07












1 Answer
1






active

oldest

votes


















3














Your code looks correct except the key in MultipartFormDataContent should be file & not file.pdf



Change the formdata to { fileStreamContent, "file", "file.pdf" }






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450941%2fhow-to-do-an-integration-test-on-my-asp-net-core-web-api-endpoint-where-i-upload%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    Your code looks correct except the key in MultipartFormDataContent should be file & not file.pdf



    Change the formdata to { fileStreamContent, "file", "file.pdf" }






    share|improve this answer


























      3














      Your code looks correct except the key in MultipartFormDataContent should be file & not file.pdf



      Change the formdata to { fileStreamContent, "file", "file.pdf" }






      share|improve this answer
























        3












        3








        3






        Your code looks correct except the key in MultipartFormDataContent should be file & not file.pdf



        Change the formdata to { fileStreamContent, "file", "file.pdf" }






        share|improve this answer












        Your code looks correct except the key in MultipartFormDataContent should be file & not file.pdf



        Change the formdata to { fileStreamContent, "file", "file.pdf" }







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 23 '18 at 18:07









        Vivian Ajay Monis

        746




        746






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450941%2fhow-to-do-an-integration-test-on-my-asp-net-core-web-api-endpoint-where-i-upload%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Contact image not getting when fetch all contact list from iPhone by CNContact

            count number of partitions of a set with n elements into k subsets

            A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks