2017-01-27 4 views
6

это можно проверить много случаев, например:Как написать тест подтверждения с разными случаями по одному методу, и все они проходят при сравнении с различными случаями ответа?

[TestCase(""), TestCase(null), TestCase("String"), TestCase("2010-07-14T00:00:00.000Z"), TestCase("201-07-14T00:00:00.000Z")] 

И когда я получаю ответ от API с десериализованным JSON к моему объекту Error Я полагаю, что сообщение Ответа Тела и HttpStatusCode правильно после различных Validations от API и это будет правильно из моего утверждения.

метод, где я десериализации от Json до общего типа:

public TType GetResponseJsonAsObject<TType>(HttpResponseMessage content) 
     { 
       var contentResult = content.Content.ReadAsStringAsync().Result; 
       var specialCase = JsonConvert.DeserializeObject<TType>(contentResult); 
       return specialCase; 
     } 

Вот мой метод испытания:

[TestCase(""), TestCase(null), TestCase("String"), TestCase("2010-07-14T00:00:00.000Z"), TestCase("201-07-14T00:00:00.000Z")] 
     public void PostAPI_SpecialCaseRequestDate_WithError_ProceedsSuccessfully(string date) 
     { 
      // arrange 
      SpecialCaseRequest data = new SpecialCaseRequest() 
      { 
       Name = "Test", 
       ExpirationDateTime = date, 
      }; 

      // act + assert 
      string json = JsonConvert.SerializeObject(data, Formatting.Indented); 
      PostMethods sendJsonDemo = new PostMethods(); 
      var response = sendJsonDemo.SendJsonDemo(json); 
      var responseBody = sendJsonDemo.GetResponseJsonAsObject<Error>(response); 
      Assert.IsNotNull(responseBody); 

      Assert.AreEqual("Date parameter cannot be empty string", responseBody.Message); 
      Assert.AreEqual("Date parameter cannot be empty null", responseBody.Message); 
     } 

Идея заключается в проверке всех случаев в одном методе и передать их успешно, но в этом случае он будет терпеть неудачу во втором Assert, потому что после того, как валидация из сообщения тела ответа API будет содержать эту строку: «Параметр Date не может быть пустой строкой», и сначала будет передано Assert, но оно не будет выполнено во втором Assert, поскольку responseBody.Message from api: «Параметр даты не может быть пустой строкой ". То же самое было бы с другими тестовыми примерами, такими как null или «String» и т. Д., Потому что из TestCase(null) он сначала не будет утверждать, потому что после проверки из тела ответа api появляется другая строка responseBody.Message = «Параметр Date не может быть пустым null». Как я могу управлять этими Asserts красиво, не создавая отдельные методы тестирования для каждой TestCase?

+0

Это зависит от вашей тестовой схемы. NTest VisualStudio не может выполнять параметризованные тесты, по крайней мере, до 2013 года. NUint может отличаться. Вам нужно будет проверить информацию для своей структуры относительно параметризованных тестов. –

+0

Можете ли вы изменить свойство ExpirationDateTime на DateTime вместо строки? Или проанализируйте ExpirationDateTime в SpecialCaseRequest в конструкторе, а затем проверьте, прежде чем отправлять его? – msr

+0

@msr Да, я могу, почему вы спрашиваете? – BinaryTie

ответ

2

Вы можете передать два параметра для проверки. Один из них - date, а второй может быть expectedError. Таким образом, ваши TestCase s будет выглядеть следующим образом:

[TestCase("", "Error1"), TestCase(null, "Error2"), TestCase("String", "Error3")] 
[TestCase("2010-07-14T00:00:00.000Z", "Error4")] 
[TestCase("201-07-14T00:00:00.000Z", "Error5")] 

И вы будете иметь только один Assert:

Assert.AreEqual(expectedError, responseBody.Message); 
0

После уточнения, что OP использует NUnit 3.5.0 Я думаю, что вы должны смотреть в атрибуте TestCaseData: https://github.com/nunit/docs/wiki/TestCaseData

Похоже, что это обеспечивает еще лучшую возможность организации кода, чем решение, предлагаемое @DovydasSopa, хотя единственное утверждение остается sam е.