2016-08-24 20 views
1

Я использую NUnit с FakeIteasyпроблема с fakeiteasy, бросая исключение

Мой тестовый метод:

[Test] 
    public async Task SiteDetailsView_NMSException() 
    { 

     url = "/Svc/v1/Sites/GetNextID?UID=" + orgUID; 
     A.CallTo(() => fake.GetDataAsync<int>(fakeHttpSession, url)).Throws(new Exception(new Uri(url), 
         new ExceptionDetail() 
          { 
           ErrorCode=ExceptionErrorCode.ParameterOutOfRange 
           Description="param OrganizationUID" 
          })); 
     // Act 
     var actionResult = await myController.DetailsView(UID, oName, oUID, isReadOnly); 
     var viewResult = actionResult as ViewResult; 
      // Assert 
     Assert.IsNotNull(actionResult); 
    } 

My controller Code: 



    public async Task<ActionResult> DetailsView(int sUID, string oName, int oUID, bool isReadOnly) 
    { 


      try 
      { 
       SModel siModel = new SModel(); 


       siModel .dite.Id = await _client.GetDataAsync<int>(Session, "/ManagementSvc/v1/ites/GetID?oUID=" + orgUID); 

      } 
      catch (Exception ex) 
      { 
       return View("Error", _plExceptionHandler.HandleException(ex)); 
      } 
     } 
    } 

Я получаю сообщение об ошибке, как

System.Uri.Format Exception : the format of URI cannot be determined.' at 
    A.CallTo(() => fake.GetDataAsync<int>(fakeHttpSession, url)).Throws(new SException(new Uri(url), new ExceptionDetail() { ErrorCode=ExceptionErrorCode.ParameterOutOfRange,Description="param OUID"})); 

есть ли способ игнорировать первый (Uri) и исключение throw. Я не могу передать нуль, а для первого параметра

вот мой Exception класс:

public class NException : Exception 
{ 
    private readonly NExceptionDetail m_ExceptionDetails; 

    private readonly Uri m_requestUri; 

    public NException(Uri requestUri, nExceptionDetail nExceptionDetails) 

    { 
     if (requestUri == null) 
      throw new ArgumentNullException("requestUri"); 

     m_requestUri = requestUri; 

    } 
} 

Как бросить NException с помощью FakeItEasy.

Я хочу делать утверждения для сообщений об ошибках.

Как я могу утверждать.

ответ

1

Вы получаете UriFormatException, потому что ваша оригинальная переменная url не является допустимым URI. Вот почему

.Throws(new NMSException(new Uri(url), 
        new NMSExceptionDetail() 
         { 
          ErrorCode=ExceptionErrorCode.ParameterOutOfRange 
          Description="param OrganizationUID" 
         })); 

throws. Вы можете увидеть то же самое, даже без FakeItEasy:

var url = "/NMS/Platform/UserManagementSvc/v1/Sites/GetNextSiteID?organizationUID=" + 0; 
new Uri(url); 

Чтобы ответить на некоторые другие вопросы вы сгруппированных здесь, вы можете игнорировать первый URL вроде этого:

A.CallTo(() => nmsFake.GetNMSPlatformDataAsync<int>(fakeHttpSession, A<string>.Ignored)) 

, как показано на Ignoring Arguments в документы FakeItEasy.

(Кстати, вы должны избавиться от одного из ваших A.CallTo с. Я думаю вы просто поставить второй в то время как вы пытаетесь некоторые вещи, так что, может быть, вы будете принимать его из вашего кода в конце концов . Хотя я на эту тему, я призываю вас, чтобы очистить ваш образец кода, что делает его как малые и целенаправленное, насколько это возможно, пока еще воспроизводя проблему Это имеет два преимущества:.

  1. , когда все становится проще, вы можете сами увидеть ответ, и
  2. это облегчает нам понимание вашего кода и ответ на ваш q ОПРОСЫ)
+0

Спасибо за помощь для игнорирования parameter.How может я по прибывшему другую проблему относительно метания пользовательского класса исключений (NMSException) –

+0

Поскольку вы получаете ошибку синтаксического анализа Ури, вы можете остановить разборе 'URL 'string (что означало бы, что вам нужен конструктор' NMSExceptionDetail', который взял что-то иное, чем 'Uri'), или построить допустимую строку URI в переменной url. –

+0

Спасибо за предложения, дайте мне знать, есть ли способ игнорировать этот параметр url для URI. Бетоз все мои сценарии исключения должны быть покрыты из этого. –