Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[Homework] Testing Web Services Problem 3 - Валидацията на байндинг модела не работи при подаване през тест

Здравейте,

Сблъсквам се със следния казус. Това ми е байндинг моделът за новината:

https://github.com/HPenchev/SoftUni-Projects/blob/master/WebServicesAndClound/WebServicesTesting/News/News.Services/Models/NewsPostBindingModel.cs

Навсякъде съм сложил Required както си му е редът.

Това е контролерът ми:

https://github.com/HPenchev/SoftUni-Projects/blob/master/WebServicesAndClound/WebServicesTesting/News/News.Services/Controllers/NewsController.cs

На 34 ред е методът PostNews

А това е тестът ми на контролера:

https://github.com/HPenchev/SoftUni-Projects/blob/master/WebServicesAndClound/WebServicesTesting/News/News.Controllers.Tests/ControllersTests.cs 

На 84 ред се опитвам да постна новина с липсващо заглавие. И проблемът е, че успявам. Пускам дебъгера и поради някаква причина на контролера изобщо не му дреме, че заглавието липсва и ми дава ModelState = true. Интересното е, че проблемът го има само при юнит тестовете. Когато опитам да подам през постман данни с липсващо заглавие по нормален начин, засича ModelState = false и ми връща код 400. Но си нямам идея на какво се дължи това. Дали някой ще успее да помогне?

Благодаря предварително!

1
C# Web Services & Cloud
a_rusenov avatar a_rusenov 1103 Точки

Валидирането на binding модела става преди да се изпълни съответния action от Web API. За целите на теста потърси как можеш да го инвалидираш (звучи малко изкуствено, но този начин тестваш дали има проверка за валидност).

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Намерих обяснение в този пост:

http://stackoverflow.com/questions/17346866/model-state-validation-in-unit-tests

0
Petar_Ivanov avatar Petar_Ivanov 27 Точки

Здравейте,

имам проблем с Integration тестването на задача 4 от домашното. След като копирам кода от демото за началните настройки на всеки тест и сложа всички нужни пакети, получавам следната грешка.

An exception of type 'System.IO.FileLoadException' occurred in News.IntegrationTests.dll but was not handled in user code

Additional information: Could not load file or assembly 'System.Web.Http.Owin, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Порових се в интернет и долу-горе разбрах, че се препокриват отделни пакети и затова се получават подобни грешки. Много ще бъда благодарен ако някой ми напише, кои точно пакети трябва да сваля, за да тръгне този код.

        private TestServer httpTestServer;
        private HttpClient httpClient;

        [TestInitialize]
        public void TestInit()
        {
            // Start OWIN testing HTTP server with Web API support
            this.httpTestServer = TestServer.Create(appBuilder =>
            {
                var config = new HttpConfiguration();
                WebApiConfig.Register(config);
                appBuilder.UseWebApi(config);
            });
            this.httpClient = httpTestServer.HttpClient;
        }

        [TestCleanup]
        public void TestCleanup()
        {
            this.httpTestServer.Dispose();
        }

 

1
a_rusenov avatar a_rusenov 1103 Точки

Пробвай да зададеш и стартъп на appBuilder-a:

httpTestServer = TestServer.Create(appBuilder =>
{
    var config = new HttpConfiguration();
    WebApiConfig.Register(config);

    var startup = new Startup();
    startup.Configuration(appBuilder);

    appBuilder.UseWebApi(config);
});

 

0
01/09/2015 11:11:52
Petar_Ivanov avatar Petar_Ivanov 27 Точки

Няма ефект същата грешка получавам. Наско евентуално може да кажеш какво и в какъв ред като пакети инсталираш, аз ползвам тези.

    using System.Collections.Generic;
    using System.Net.Http;
    using System.Web.Http;
    using Data;
    using Microsoft.Owin.Testing;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Owin;
    using Services;
    using Services.Models.ViewModels;

 

0
a_rusenov avatar a_rusenov 1103 Точки

Ами на празен тестов проект инсталирам Microsoft.Owin.Testing и Microsoft.AspNet.WebApi.OwinSelfHost - с тях вървят една камара други пакети. След това инсталирам Entity Framework, променям кънекшън стринга да се връзва към тестова база и пускам тестовете.

0
kiko144 avatar kiko144 795 Точки

Съвет:

Можеш да не слагаш Required на типове, който не могат да са null.

Примерно int. Ако не въведеш стойност ще гръмне, защото не може да присвой null, което реално изпълнява ролята на Required атрибута. DateTime, също е такъв тип :)

-1
a.angelov avatar a.angelov 1316 Точки

Всъщност най-лесния начин, който открих за инвалидиране на ModelState-а е следният:

newsController.ModelState.AddModelError("Title", "Title MinLength is 5.");

Добавя се custom error към ModelState-а на контролера, който тестваме.

Ето и оригиналният източник.

1
02/09/2015 00:17:18
aivian avatar aivian 51 Точки

 Някой знае ли как да настроя IHttpActionResult Create() да връща Created()? Опитвам се да направя втория тест на трета задача да проверява дали връща StatusCode - 201 Created, но не знам как да си настроя location - а, който изисква.

0
04/09/2015 20:39:29
a.angelov avatar a.angelov 1316 Точки

Аз съм го направил така - връща url и самата новина:

return this.Created("api/news/" + newNews.Id, newNews);

 

2
a_rusenov avatar a_rusenov 1103 Точки

Има и друг вариант - подаваш името на route от WebApiConfig и то автоматично ще построи location:

return this.CreatedAtRoute(
    "DefaultApi",
    new { id = data.Id }, 
    data);

DefaultApi отговаря на "api/{controller}/{id}".

1
aivian avatar aivian 51 Точки

С на aangelov начина се получи, и теста мина. Когато ползвам DefaultApi, нормална заявка минава и връща 201, но не мога да тествам - кара ми се по следния начин "A route named 'DefaultApi' could not be found in the route collection. Нямам идея защо прави така, може би защото е мокнато.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.