Опасно использовать переменные класса Scoped в TestMethods

Я новичок как в MOQ, так и в TDD / модульном тестировании. Я обнаружил, что повторяю большую часть одного и того же кода в разделе "Упорядочить" каждого метода тестирования, и кажется, что действительно должен быть лучший способ.

Сначала код, который часто повторяется:

#region Arrange

    #region create my Mock Objects

        var serviceMock = new Mock<IOrganizationService>();
        var factoryMock = new Mock<IOrganizationServiceFactory>();
        var tracingServiceMock = new Mock<ITracingService>();
        var notificationServiceMock = new Mock<IServiceEndpointNotificationService>();
        var pluginContextMock = new Mock<IPluginExecutionContext>();
        var serviceProviderMock = new Mock<IServiceProvider>();

    #endregion

    #region Authentication Stuff

        var organizationUri = "http://.../XRMServices/2011/Organization.svc";
        var orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(organizationUri));
        var credentials = new AuthenticationCredentials();
        var username = "USER_ID";
        var password = "USER_PWD";
        var domain = "MyDomain";
        credentials.ClientCredentials. Windows.ClientCredential = new NetworkCredential(username, password, domain);
        IOrganizationService service = new OrganizationServiceProxy(orgServiceManagement, credentials.ClientCredentials);

    #endregion

#endregion

Я подумывал о создании пользовательских фрагментов, констант и т. Д., Но это не спасло бы повторяющийся код, просто сэкономило мне время на ввод текста.

Затем я подумал о том, чтобы определить все вышеперечисленное на уровне класса... но некоторые предупреждающие сигналы прозвучали... Если класс создает один раз для всех методов тестирования, тогда может ли быть возможность загрязнения переменной? Учитывая небольшой пример, этого действительно не произойдет, но я стараюсь думать заранее / развивать хорошие практики и привычки.

Как насчет создания объекта "Mock & Authentication", в котором все это определено в этом объекте. Тогда у меня могло быть несколько таких объектов с разными учетными данными, и мои методы тестирования могли ссылаться / использовать только одну необходимую вариацию?

Так что бы вы посоветовали / применили к моим тестовым примерам некоторые принципы СУХОЙ.

1 ответ

Решение

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

Затем я подумал о том, чтобы определить все вышеперечисленное на уровне класса... но некоторые предупреждающие сигналы прозвучали... Если класс создает один раз для всех методов тестирования, тогда может ли быть возможность загрязнения переменной?

Нет, большинство исполнителей тестов создают экземпляр класса теста для каждого запуска теста, и платформы модульных тестов обычно допускают сортировку перед настройкой теста, фрагмент кода (обычно метод или конструктор), который делает именно это.

В NUnit вы получили [SetUp] атрибут (MS Test использует [TestInitialize] в то время как xUnit использует конструктор класса):

[SetUp]
public void InitializeDependencies()
{  
    serviceMock = new Mock<IOrganizationService>();
    // ...
}

Так вы обычно решаете подобные проблемы.

Как насчет создания объекта "Mock & Authentication", в котором все это определено в этом объекте.

Хотя это может быть хорошей идеей для аутентификации, это, конечно, не так хорошо для насмешек. Тот факт, что вы даже считаете, что это снова звонит в рефакторинг.

Другие вопросы по тегам