Hackersdelight

  1. About
  2. Ask Me
  3. Subscribe
  4. Archive
  5. Random

Hackersdelight

Here I'm going to post my notes about my professional life, salvations of some coding problems and other useful for me information. These notes are for me only, so if there is smth you don’t like I really don’t care.

Newer
Older
  • Nunit, XML и HttpWebRequest

    На этой неделе вожусь с тестированием  фукнционала, который присобачила за последние 2 недели. 

    Для начала немножко об NUnit. Давно я уже его не видела, курса эдак со 2го, да и тогда он, можно сказать, прошел мимо меня, потому что я наивно полагала, что в этой жизни он мне нафиг не упал. О! Как я ошибалась! Похоже, в первый месяц мои работодатели решили разом поднять все, что я недоучила в вузе: xml, кэширование, Nunit… только многопоточности еще не хватает.

    В принципе знать о модульном тестировании много не надо: 

    1. делаешь класс с атрибутом [TestFixture]
    2. в нем пишешь методы-тесты с атрибутом [Test]
    3. если результатом теста должна быть ошибка пишешь еще атрибут [ExpectedException(typeof(<тип ошибки>))]
    4. в конце метода, если он не ошибковозвращающий используется класс Assert и его чудо-методы, который определяет, успешно ли пройден тест. 

    Далее о самих тестах этого понедельника.

    Тест 1: сделать запрос страницы, о которой уже упомяналось ранее и проверить, что возвращенный XML именно то, что мы хотели получить. Чтобы не писать кучу проверок, сделала только проверки на наличие ключевых узлов и атрибутов. 

    Кочка номер один: послать запрос на сервер. 

    Проще простого на деле просто пишешь код вида:

    	XmlDocument resultXML = new XmlDocument();
    	HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(connection);
    	using (var response = new StreamReader(request.GetResponse().GetResponseStream()))
    	{
    		resultXML.LoadXml(response.ReadToEnd());
    	}

    Кочка номер два: выбрать ключевые узлы и проанализировать их.

    По незнанию сперва сделала быдло-методом. Стыдно, конечно, но больше такой ошибки не повторю:

    	XmlNodeList resultNode = resultXML.GetElementsByTagName("Result");
    	if (resultNode.Count != 0)
    	{
    		XmlNode rootChild = resultNode[0].FirstChild;
    		if (rootChild.Name == "Item" && rootChild.Attributes["type"].Value == "ItemType")
    		{
    			for (int i = 0; i < rootChild.ChildNodes.Count; i++)
    			{
    				if (rootChild.ChildNodes[i].Name == "name" && rootChild.ChildNodes[i].InnerText.ToLower() == param.ToLower())
    				{
    					testRes = true;
    					break;
    				}
    			}
    		}
    	}

    Уже после того, как мой мудрый суgервайзер сказал, что это бред, сделала как надо:

    	XPathNavigator nav = resultXML.CreateNavigator();
    
    	XPathNodeIterator iterator = (XPathNodeIterator)nav.Select("//Result/Item[@type='ItemType']/name['Part']");
    
    	if (iterator.Count != 0)
    
    		testRes = true;

    Тест 2: как послать повторный запрос на сервер, чтобы в итоге от вернул 304?

    string connection = ConnectionInfo.InnovatorServerURL.ToString() + “/ItemType.aspx”;

    HttpWebResponse response = (HttpWebResponse)HttpWebRequest.Create(connection).GetResponse();

    HttpWebRequest resRequest = (HttpWebRequest)HttpWebRequest.Create(connection);

    resRequest.IfModifiedSince = response.LastModified;

    HttpWebResponse resResponse = (HttpWebResponse)resRequest.GetResponse();

    Так и только так, потому что заголовок IfModifiedSince выставляет клиент, а не сервер, а так как в данном случае браузер мы не используем, данный параметр прописываем на сервере ручками. 

    Источники

    1. поиск по документу с xpath
    2. доступ к атрибутам модели dom
    3. запрос к вебстранице из кода
    4. работа с xml в .net

    Tagged: HTTP Csharp.NET NUnit eXtensible Markup Language XPath

    Posted on September 23, 2011 with 212 notes

    1. panaryna posted this
  • gaidar
  • html5insight

Field Notes Theme. Redesigned by Aliaksandra Panaryna. Powered by Tumblr.