2015-09-18 7 views
2

У меня есть RelayCommand, который я пытаюсь проверить. RelayCommand содержит Service Call для аутентификации моего пользователя. Показанный ниже:Как написать модульный тест для RelayCommand, который содержит вызов службы Async?

private MvxCommand _signIn; 
public MvxCommand SignIn 
{ 
    get 
    { 
     return _signIn ?? (_signIn = new MvxCommand(() => 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); 
      EndpointAddress endpoint = new EndpointAddress(AppResources.AuthService); 
      var client = new MyService(binding, endpoint); 
      client.AuthorizeCompleted += ((sender, args) => 
      { 
       try 
       { 
        if (args.Result) 
        { 
         //Success.. Carry on 
        } 
       } 
       catch (Exception ex) 
       { 
        //AccessDenied Exception thrown by service 
        if (ex.InnerException != null && string.Equals(ex.InnerException.Message, "Access is denied.", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         //Display Message.. Incorrect Credentials 
        } 
        else 
        { 
         //Other error... Service down? 
        } 
       } 
      }); 

      client.AuthorizeAsync(UserName, Password, null); 

     })); 
    } 
} 

Но теперь я использую NUnit, чтобы проверить мой ViewModels и я озадачен о том, как проверить мой RelayCommand

я могу сделать:

[Test] 
public void PerformTest() 
{ 
    ViewModel.SignIn.Execute(); 
} 

Но это не возвращает никакой информации о том, удался ли метод SignIn или нет.

Как проверить RelayCommand, содержащий Service Call?

+0

Это похоже на интеграционный тест для меня, а не на единичный тест. Какое подразделение вы заинтересованы в тестировании? Если это модель представления, вы можете/должны ввести функцию фиктивного (тестового) тестирования, чтобы проверить, отправляются ли правильные аргументы. –

+0

Я новичок в автоматическом тестировании, но, глядя на него, вы можете быть правы, это, возможно, интеграционный тест. Я тестирую свою модель просмотра. Если я использую модель фиктивного представления. Это не будет проверять мою службу, есть ли еще один метод тестирования службы? – user1

+0

Чтобы проверить свою модель просмотра, не используйте фиктивный режим просмотра. Внесите метод проверки в свою модель просмотра, которую вы можете использовать, чтобы убедиться, что ваша модель просмотра правильно называет вашу службу. Вы должны вызвать прокси изнутри. Источник самой службы сервиса должен иметь свои собственные модульные тесты. Если вы хотите провести комплексное тестирование интеграции, это будет сложно автоматизировать. Извините, если бы у меня был ответ на проблему, я бы ответил. Все, что я могу сделать, это попытаться пролить свет на проблему. –

ответ

1

Таким образом, в конце концов, я использовал Dependency Injection внедрить услугу в конструктор моих ViewModel, как так:

public IMyService client { get; set; } 

public MyClass(IMyService myservice) 
{ 
    client = myservice 
} 

Я тогда реорганизовать мой SignIn метод следующим образом:

private MvxCommand _signIn; 
public MvxCommand SignIn 
{ 
    get 
    { 
     return _signIn ?? (_signIn = new MvxCommand(() => 
     { 
      client.AuthorizeCompleted += ((sender, args) => 
      { 
       try 
       { 
        if (args.Result) 
        { 
         //Success.. Carry on 
        } 
       } 
       catch (Exception ex) 
       { 
        //AccessDenied Exception thrown by service 
        if (ex.InnerException != null && string.Equals(ex.InnerException.Message, "Access is denied.", StringComparison.CurrentCultureIgnoreCase)) 
        { 
         //Display Message.. Incorrect Credentials 
        } 
        else 
        { 
         //Other error... Service down? 
        } 
       } 
      }); 
      client.AuthorizeAsync(UserName, Password, null); 
     })); 
    } 
} 

и испытание мой ViewModel, используя макет службы с использованием шаблона Assign-Act-Assert:

[Test] 
    public void PerformTest() 
    { 
     List<object> objs = new List<object>(); 
     Exception ex = new Exception("Access is denied."); 
     objs.Add(true); 

     AuthorizeCompletedEventArgs incorrectPasswordArgs = new AuthorizeCompletedEventArgs(null, ex, false, null); 
     AuthorizeCompletedEventArgs correctPasswordArgs = new AuthorizeCompletedEventArgs(objs.ToArray(), null, false, null); 

     Moq.Mock<IMyService> client = new Mock<IMyService>(); 

     client .Setup(t => t.AuthorizeAsync(It.Is<string>((s) => s == "correct"), It.Is<string>((s) => s == "correct"))).Callback(() => 
     { 
      client.Raise(t => t.AuthorizeCompleted += null, correctPasswordArgs); 
     }); 


     client.Setup(t => t.AuthorizeAsync(It.IsAny<string>(), It.IsAny<string>())).Callback(() => 
     { 
      client.Raise(t => t.AuthorizeCompleted += null, incorrectPasswordArgs); 
     }); 

     var ViewModel = new MyClass(client.Object); 

     ViewModel.UserName = "correct"; 
     ViewModel.Password = "correct"; 
     ViewModel.SignIn.Execute(); 
    }