Частные методы модульного тестирования в WP7

#c# #unit-testing #windows-phone-7

#c# #модульное тестирование #windows-phone-7

Вопрос:

Я хочу написать модульные тесты для своих частных методов в коде приложения WP7. Итак, я хотел бы знать, как вызывать частные методы из кода модульного тестирования Silverlight. Ниже приведен фрагмент кода, для которого я хотел бы написать модульный тест.

     private void Next_Click(object sender, EventArgs e)
    {
        nextBtn.IsEnabled = false;
        checking = true;
        App app = Application.Current as App;
        //Microsoft.Phone.Controls.TiltEffect.SetIsTiltEnabled((App.Current as App).RootFrame, true);

        if (String.IsNullOrEmpty(AppHelper.AuthenticationToken))
        {
            // Get Authentication Token
            try
            {
                app.Flickr.AuthGetTokenAsync(frob, r =>
                {
                    Dispatcher.BeginInvoke(() =>
                    {
                        if (r.HasError)
                        {
                            MessageBox.Show("Flickr error  ("   r.ErrorMessage   ") - did you click Ok before setting flickr up in your browser?");
                        }
                        else
                        {
                            // Store the authentication token
                            AppSettings.AuthenticationToken = r.Result.Token;
                            if (AppSettings.IsLoginIconPressed == false)
                            {
                                NavigationService.Navigate(new Uri("/Upload.xaml", UriKind.Relative));
                            }
                            else
                            {
                                app.isNavigatedFromPage = true;
                                NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                                AppSettings.IsLoginIconPressed = false;
                            }
                        }

                        checking = false;
                    });
                });
            }
            catch (Exception ex)
            {
                MessageBox.Show("Flickr error  ("   ex.Message   ") - did you click Ok before setting flickr up in your browser?");
            }

        } // End of if
        else
        {
            if (AppSettings.IsLoginIconPressed == false)
            {
                app.isNavigatedFromPage = true;
                NavigationService.Navigate(new Uri("/Upload.xaml", UriKind.Relative));
            }
            else
            {
                app.isNavigatedFromPage = true;
                NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                AppSettings.IsLoginIconPressed = false;
            }
        } // End of else
    }
  

Комментарии:

1. Выставьте его как общедоступный (т. Е. Измените Его с частного на общедоступный). Большинство тестовых пакетов рассматривают только общедоступные интерфейсы, поскольку это та часть, которая обычно нуждается в тестировании, т.Е. «общедоступный интерфейс».

Ответ №1:

Так же, как и с другими .В чистом коде вы можете использовать атрибут InternalsVisibleTo.

Здесь есть описание этого, а также нескольких других специфичных для WP7 вещей.

Однако один комментарий заключается в том, что желание тестировать частные методы часто является запахом кода — хорошо продуманный код обычно имеет открытый интерфейс, который позволяет проводить тщательное тестирование без необходимости специально тестировать частные методы.


В дополнение к общему замечанию о модульном тестировании и частных методах я настоятельно рекомендую вам взглянуть на шаблон проектирования MVVM. Основная причина, по которой вы хотите протестировать частный метод next_click, заключается в том, что вы вложили в свой код пользовательского интерфейса много бизнес-логики. MVVM — это шаблон, который помещает такую логику в легко тестируемые классы Model и ViewModel, а Silverlight имеет несколько функций, которые делают шаблон особенно простым в использовании.

Ответ №2:

Private означает, что вы можете вызывать его только из текущего класса, а не извне. Модульный тест находится снаружи.

Сделайте его общедоступным, если вы действительно хотите протестировать его напрямую, или измените его видимость другими способами.