Laden...

WebApi : Test Async Methoden

Erstellt von Ahrimaan vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.116 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 9 Jahren
WebApi : Test Async Methoden

Hallo zusammen,

ich habe einen WebApi Post wo ich eine Datei hochlade :

        public async Task<Models.FileUploadResult> Post()
        {
            var clientIp = this.GetClientIp();
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                return new Models.FileUploadResult { ResultText = FileResult.CorruptPdf.GetTranslation() };
            }

            var result = new Models.FileUploadResult();
            var provider = this.providerFactory.GetProvider();
            try
            {
                var multipartResult = await Request.Content.ReadAsMultipartAsync(provider);
                if (multipartResult.Contents.Count > 0)
                {
                    var fileContent = multipartResult.Contents.FirstOrDefault();
                    var contractNumber = Request.Headers.FirstOrDefault(x => x.Key == "Contract-Number")
                                                .Value.FirstOrDefault();

                    var fileType = Request.Headers.FirstOrDefault(x => x.Key == "File-Type")
                                                .Value.FirstOrDefault();
                    if (fileContent != null && !string.IsNullOrEmpty(contractNumber) && !string.IsNullOrEmpty(fileType))
                    {
                        var fileData = await fileContent.ReadAsByteArrayAsync();
                        var fileScanResult = this.fileService.ScanAndValidateFile(fileData,contractNumber,fileType);
                        result.ResultText = fileScanResult.Result.GetTranslation();
                        result.FileId = fileScanResult.FileId;
                    }
                    else
                    {
                        result.ResultText = string.IsNullOrEmpty(result.ResultText) ? FileResult.Faulted.GetTranslation() : result.ResultText;
                        this.logger.Error(string.Format("Upload from file broken. Result:{0} , IP:{1}, StackTrace:{2}", result.ResultText, clientIp, "fileContent or file was empty"));
                    }
                }             
            }
            catch(Exception e)
            {
                result.ResultText = string.IsNullOrEmpty(result.ResultText) ? FileResult.Faulted.GetTranslation() : result.ResultText;
                this.logger.Error(string.Format("Upload from file broken. Result:{0} , IP:{1}, StackTrace:{2}", result.ResultText, clientIp, e.StackTrace));
            }

            this.logger.Info(string.Format("Uploaded File with Result:{0} , IP:{1}", result.ResultText, clientIp));
            return result;
        }

So weit so schön, klappt auch super !
Nur wenn ich das ganze nun testen soll, bricht er bei

var multipartResult = await Request.Content.ReadAsMultipartAsync(provider);

ab.
Der Testaufruf sieht erstmal so aus :

Task.Run(async () =>
            {
                this.sut.Post();
            }).GetAwaiter().GetResult();

Ich gehe davon aus, dass er beim Await einfach abbricht weil der Task für ihn dann zuende ist.
Kann das sein ? Und wenn ja wie behebe ich das Problem ?

Grüße

16.842 Beiträge seit 2008
vor 9 Jahren

Bitte verwende die Objekt-orientierte Programmierung wie sie gedacht ist; teile Einzelaufgaben der Methode in weitere Methoden auf und teste somit kleinere Stücke und dann das Gesamtbild.
Evtl. auch mal Dependency Injection anschauen, verstehen und verwenden 😉

Aber so setzt Du nicht das Testen um, wie man es eigentlich macht.
Wie man asynchronen Code testet steht übrigens sehr sehr ausführlich in der MSDN.

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 9 Jahren

Bitte verwende die Objekt-orientierte Programmierung wie sie gedacht ist; teile Einzelaufgaben der Methode in weitere Methoden auf und teste somit kleinere Stücke und dann das Gesamtbild.
Evtl. auch mal Dependency Injection anschauen, verstehen und verwenden 😉

Aber so setzt Du nicht das Testen um, wie man es eigentlich macht.
Wie man asynchronen Code testet steht übrigens sehr sehr ausführlich in der MSDN.

Hallo Benjamin,

wirkt etwas herablassend wen man nicht den ganzen Code sieht.

Alle externen Services sind per DI in den WebApi Controller injiziert. DI ist definitv meine 100% Arbeitsweise 😉

Zweitens habe ich das nur so formatiert, bzw umgeschrieben damit man sieht was da passiert, quasi ein beispiel.

Und wenn du die MSDN testweise meinst: Auch diese verursaxcht genau das selbe Problem...

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 9 Jahren

So ich habe jetzt alles durch und es liegt am MultipartStreamProvider : Ich wrappe das ganze um es testbar zu machen.
Leider funktioniert das ganze nicht so richtig.
Deswegen erstmal hier zu

Grüße