2016-02-11 2 views
0

Иногда в моем тесте я должен выполнить вызов разные настройки(), который устанавливает Mocks по-разному для каждого испытания - например, так:Модульное тестирование и насмешливый для каждого теста

private void Setup(bool isTrue) 
{ 
    mock.Setup(x => x.DisplayNames).Returns(new Dictionary<int, string>()); 
    // ... 
    // 5x more of these are the same for all tests 

    if (isTrue) 
     mock.Setup(x => x.DisplayOld).Returns(isTrue); 
     // 5x more of these parameterlized setups 
     ... 
} 

Теперь, в каждом из моих Я бы сделал вызов Setup (true/false).

Поскольку модульные тесты выполняются параллельно (по умолчанию xUnit), это вызовет любые проблемы с блокировкой? (Предположим, что два теста одновременно называют Setup()).

Если это так:

  1. , как исправить эту ситуацию?
  2. Каков правильный подход, если вы хотите иметь один метод (например, setup()) с переданным параметром - для разных сценариев смешения?
+0

Если ваш метод «Setup» автоматически вызывается инфраструктурой тестирования устройства, то да, у вас будут проблемы. Если это действительно вызвано вашими тестами, то это должно быть хорошо, если предположить, что A) издевавшиеся объекты не сохраняются статически (например, на фабрике объектов) и B), издевавшиеся объекты не настраиваются с использованием общих функций (например: '.Returns (myDictionarySharedBetweenTests)'. – Rob

+0

Роб, вы можете прояснить? Да, я вызываю setup() из каждого из моих методов [Fact], и это простая настройка, как в коде выше, где Просто разные сценарии настройки, основанные на флагове bool ex: mock.Setup (x => x.DoSomething). Возвраты (true)/false и т. д. – ShaneKm

ответ

0

Вам необходимо использовать параметризованное модульное тестирование. Может использоваться атрибут InlineData для xUnit test framework. В этом случае макет не нужно устанавливать в методе настройки. Он может быть установлен непосредственно в реальном методе тестирования. Ваш метод испытаний будет выглядеть, как показано ниже

[Theory] 
[InlineData(false)] 
[InlineData(true)] 
public void SampleTest(bool flag) 
{ 
    .... //do any set up operations 
    .... //Assert logic to verify 
} 

Тест структура будет генерировать, как много методов во время выполнения на основе ввода вы предоставляете с атрибутом InlineData. Поскольку во время выполнения метод тестирования разбит на отдельные методы, вы не будете сталкиваться с проблемами блокировки или потоковой передачи.

+0

это не выполнимо .. У меня будет куча дублирующего кода для 10x moq настройки и только один, который изменяется с параметром. – ShaneKm

+0

Возможно, все еще возможно @ShaneKm. Вы можете написать общий код в отдельном методе и вызвать этот метод из вашего тестового метода. – Chris

0

Проверьте статью о шаблоне Test Context. Вы можете иметь mocks как локальные переменные и настраивать их настройку в классе тестового контекста. Тогда безопасно запускать их параллельно. Я использую этот шаблон в Java с JUnit + Mockito и в .Net с NUnit/MSTest + Moq.

+0

это все еще не решает проблему настройки m ocks (аналогично) 10 раз и настройка только 1 mock по-разному на основе параметра. В итоге вы получаете 10x ctx.SomeMock.Setup() – ShaneKm

+0

Обычно у меня есть метод, подобный PerformDefaultSetup() в TestContext. Таким образом, мне не нужно повторять одну и ту же настройку в методах тестирования. –

Смежные вопросы